diff --git a/telegram-agy-bot/bot.py b/telegram-agy-bot/bot.py index 689a8a4..0b475ca 100644 --- a/telegram-agy-bot/bot.py +++ b/telegram-agy-bot/bot.py @@ -45,6 +45,7 @@ from formatters import ( format_thought, format_tool_call, format_context_stats, + get_model_display_name, format_git_info, format_git_commits_page, format_commit_detail_view, @@ -2744,12 +2745,15 @@ async def process_agent_turn_by_chat_id( if initial_status_text: initial_status = initial_status_text else: + model_to_use = getattr(curr_proj, "model", None) or getattr(session, "model", None) or settings.default_model or "gemini-3.7-flash-auto" + effort_to_use = getattr(curr_proj, "reasoning_effort", None) or getattr(session, "reasoning_effort", None) + model_display = get_model_display_name(model_to_use, effort_to_use) initial_status = ( f"📁 پروژه: {escape_html(curr_proj.name)}\n\n" - f"💭 در حال تفکر روی پروژه {escape_html(curr_proj.name)}..." + f"💭 در حال تفکر با مدل {escape_html(model_display)}..." if is_fa else f"📁 Project: {escape_html(curr_proj.name)}\n\n" - f"💭 Thinking on project {escape_html(curr_proj.name)}..." + f"💭 Thinking with model {escape_html(model_display)}..." ) status_msg = await app.bot.send_message( chat_id=chat_id, @@ -6450,19 +6454,23 @@ async def process_agent_turn( session_manager.cancel_active_task(chat_id) - # Initial thinking status message clearly stating which project is active + model_to_use = getattr(curr_proj, "model", None) or getattr(session, "model", None) or settings.default_model or "gemini-3.7-flash-auto" + effort_to_use = getattr(curr_proj, "reasoning_effort", None) or getattr(session, "reasoning_effort", None) + model_display = get_model_display_name(model_to_use, effort_to_use) + + # Initial thinking status message clearly stating which project and model are active if status_msg_to_reuse: status_msg = status_msg_to_reuse else: if is_fa: initial_status = ( f"📁 پروژه: {escape_html(curr_proj.name)}\n\n" - f"💭 در حال تفکر روی پروژه {escape_html(curr_proj.name)}..." + f"💭 در حال تفکر با مدل {escape_html(model_display)}..." ) else: initial_status = ( f"📁 Project: {escape_html(curr_proj.name)}\n\n" - f"💭 Thinking on project {escape_html(curr_proj.name)}..." + f"💭 Thinking with model {escape_html(model_display)}..." ) status_msg = await update.effective_message.reply_html( @@ -6508,21 +6516,21 @@ async def process_agent_turn( # Suffix at the BOTTOM of the message bottom_parts = [] - # 1. Thinking blockquote at the bottom with project name + # 1. Thinking blockquote at the bottom with model name if settings.enable_thinking_display and thoughts: thought_content = "\n".join(thoughts[-3:]) - bottom_parts.append(format_thought(thought_content, project_name=curr_proj.name, lang=session.language).strip()) + bottom_parts.append(format_thought(thought_content, model_name=model_display, lang=session.language).strip()) # 2. Active tools at the bottom if settings.enable_tool_notifications and tools: bottom_parts.append("\n".join(tools[-2:]).strip()) - # 3. Status indicator at the bottom stating which project is being thought on + # 3. Status indicator at the bottom stating which model is being used if not final: if is_fa: - bottom_parts.append(f"💭 در حال تفکر روی پروژه {escape_html(curr_proj.name)}... ▌") + bottom_parts.append(f"💭 در حال تفکر با مدل {escape_html(model_display)}... ▌") else: - bottom_parts.append(f"💭 Thinking on project {escape_html(curr_proj.name)}... ▌") + bottom_parts.append(f"💭 Thinking with model {escape_html(model_display)}... ▌") if raw_text.strip(): formatted_body = markdown_to_telegram_html(raw_text) @@ -6536,7 +6544,7 @@ async def process_agent_turn( if bottom_parts: full_html = proj_header + "\n\n" + "\n\n".join(bottom_parts) else: - thinking_msg = f"💭 در حال تفکر روی پروژه {escape_html(curr_proj.name)}... ▌" if is_fa else f"💭 Thinking on project {escape_html(curr_proj.name)}... ▌" + thinking_msg = f"💭 در حال تفکر با مدل {escape_html(model_display)}... ▌" if is_fa else f"💭 Thinking with model {escape_html(model_display)}... ▌" full_html = proj_header + "\n\n" + thinking_msg if len(full_html) > settings.max_message_length: diff --git a/telegram-agy-bot/formatters.py b/telegram-agy-bot/formatters.py index 841a5b3..0745414 100644 --- a/telegram-agy-bot/formatters.py +++ b/telegram-agy-bot/formatters.py @@ -33,6 +33,40 @@ def format_duration_compact(seconds: float) -> str: return f"{m}:{s:02d}" +def get_model_display_name(model: Optional[str] = None, effort: Optional[str] = None) -> str: + """Returns a clean user-friendly display name for the model and reasoning effort.""" + if not model: + return "Gemini 3.7 Flash Auto" + + m_clean = model.lower().strip() + eff_clean = (effort or "").lower().strip() + + if "flash-auto" in m_clean or m_clean == "gemini-3.7-flash-auto": + if eff_clean == "high": + return "Gemini 3.7 Flash Auto [High]" + elif eff_clean == "medium": + return "Gemini 3.7 Flash Auto [Med]" + elif eff_clean == "low": + return "Gemini 3.7 Flash Auto [Low]" + return "Gemini 3.7 Flash Auto" + elif "flash-high" in m_clean: + return "Gemini 3.7 Flash [High]" + elif "3.7-flash" in m_clean: + return f"Gemini 3.7 Flash [{eff_clean.capitalize()}]" if eff_clean else "Gemini 3.7 Flash" + elif "3.6-flash" in m_clean: + return f"Gemini 3.6 Flash [{eff_clean.capitalize()}]" if eff_clean else "Gemini 3.6 Flash" + elif "3.1-pro" in m_clean or "pro" in m_clean: + return f"Gemini 3.1 Pro [{eff_clean.capitalize()}]" if eff_clean else "Gemini 3.1 Pro" + elif "opus" in m_clean: + return "Claude Opus 4.6 Thinking" + elif "sonnet" in m_clean or "claude" in m_clean: + return "Claude Sonnet 4.6 Thinking" + elif "gpt" in m_clean: + return "GPT-120B" + else: + return model + + def format_context_stats( usage: Optional[Dict[str, Any]] = None, duration: float = 0.0, @@ -115,16 +149,22 @@ def format_context_stats( def format_thought( thought_text: str, project_name: Optional[str] = None, + model_name: Optional[str] = None, lang: str = "fa", ) -> str: - """Formats model reasoning / thinking process with project context.""" + """Formats model reasoning / thinking process with model context.""" if not thought_text.strip(): return "" escaped = escape_html(thought_text.strip()) is_fa = (lang or "").lower() in ("fa", "farsi", "persian", "🇮🇷 persian / farsi (فارسی)") - if project_name: - proj_badge = escape_html(project_name) - header = f"💭 تفکر و استدلال (پروژه: {proj_badge}):" if is_fa else f"💭 Reasoning / Thinking (Project: {proj_badge}):" + + label = model_name or project_name + if label: + badge = escape_html(label) + if model_name: + header = f"💭 تفکر و استدلال (مدل: {badge}):" if is_fa else f"💭 Reasoning / Thinking (Model: {badge}):" + else: + header = f"💭 تفکر و استدلال ({badge}):" if is_fa else f"💭 Reasoning / Thinking ({badge}):" else: header = "💭 تفکر و استدلال:" if is_fa else "💭 Reasoning / Thinking:" return f"
{header}\n{escaped}
\n" diff --git a/telegram-agy-bot/sessions.json b/telegram-agy-bot/sessions.json index 42ab63e..77b8fef 100644 --- a/telegram-agy-bot/sessions.json +++ b/telegram-agy-bot/sessions.json @@ -52,9 +52,9 @@ "model": "gemini-3.7-flash-auto", "effort": "high", "language": "fa", - "last_context_length": 5323, - "last_total_tokens": 46412, - "last_response": "\u0645\u062a\u0646\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0632\u0645\u0627\u0646 \u067e\u0631\u062f\u0627\u0632\u0634 \u0632\u0646\u062f\u0647 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062f\u0631 \u0632\u06cc\u0631 \u067e\u06cc\u0627\u0645 \u062a\u0644\u06af\u0631\u0627\u0645 \u06cc\u0627 \u062f\u0631 \u0627\u0646\u062a\u0647\u0627\u06cc \u0622\u0646 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0634\u0627\u0645\u0644 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0632\u06cc\u0631 \u062f\u0631 \u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u0631\u0628\u0627\u062a \u062a\u0644\u06af\u0631\u0627\u0645 \u0647\u0633\u062a\u0646\u062f:\n\n---\n\n### \u06f1. \u0645\u062a\u0646 \u0648\u0636\u0639\u06cc\u062a \u0648 \u0646\u0634\u0627\u0646\u06af\u0631 \u0644\u0627\u06cc\u0648 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u0633\u062a\u0631\u06cc\u0645 (Live Status & Cursor)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/bot.py`](file:///root/telegram-agy-bot/bot.py#L6458-L6541)\n* **\u0645\u062a\u0646 \u0627\u0648\u0644\u06cc\u0647 (\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u067e\u0627\u0633\u062e):**\n ```html\n \ud83d\udcc1 \u067e\u0631\u0648\u0698\u0647: {curr_proj.name}\n\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0631\u0648\u06cc \u067e\u0631\u0648\u0698\u0647 {curr_proj.name}...\n ```\n *(\u062e\u0637\u0648\u0637 \u06f6\u06f4\u06f5\u06f8 \u062a\u0627 \u06f6\u06f4\u06f6\u06f6 \u0641\u0627\u06cc\u0644 [`bot.py`](file:///root/telegram-agy-bot/bot.py#L6458-L6466))*\n\n* **\u0646\u0634\u0627\u0646\u06af\u0631 \u0632\u0646\u062f\u0647 \u062a\u0641\u06a9\u0631 \u062f\u0631 \u062d\u06cc\u0646 \u062a\u0648\u0644\u06cc\u062f \u067e\u0627\u0633\u062e (\u0632\u06cc\u0631 \u0645\u062a\u0646 \u062f\u0631 \u062d\u0627\u0644 \u0627\u0633\u062a\u0631\u06cc\u0645):**\n ```html\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0631\u0648\u06cc \u067e\u0631\u0648\u0698\u0647 {curr_proj.name}... \u258c\n ```\n *(\u062e\u0637\u0648\u0637 \u06f6\u06f5\u06f2\u06f3 \u0648 \u06f6\u06f5\u06f3\u06f9 \u0641\u0627\u06cc\u0644 [`bot.py`](file:///root/telegram-agy-bot/bot.py#L6523))*\n\n* **\u0646\u0634\u0627\u0646\u06af\u0631 \u0627\u062f\u0627\u0645\u0647 \u062f\u0631 \u067e\u06cc\u0627\u0645 \u0628\u0639\u062f\u06cc (\u062f\u0631 \u0635\u0648\u0631\u062a \u0637\u0648\u0644\u0627\u0646\u06cc \u0634\u062f\u0646 \u0645\u062a\u0646):**\n ```html\n ...\n (\u0627\u062f\u0627\u0645\u0647 \u062f\u0631 \u067e\u06cc\u0627\u0645 \u0628\u0639\u062f\u06cc...)\n ```\n *(\u062e\u0637 \u06f6\u06f5\u06f4\u06f7 \u0641\u0627\u06cc\u0644 [`bot.py`](file:///root/telegram-agy-bot/bot.py#L6547))*\n\n---\n\n### \u06f2. \u0628\u0627\u06a9\u0633 \u062a\u0641\u06a9\u0631 \u0648 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0645\u062f\u0644 (Thinking Blockquote)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py#L115-L130) (\u062a\u0627\u0628\u0639 `format_thought`)\n* **\u0645\u062a\u0646 \u062a\u06cc\u062a\u0631 \u0628\u0627\u06a9\u0633 \u062a\u0641\u06a9\u0631 \u062c\u0645\u0639\u200c\u0634\u0648\u0646\u062f\u0647:**\n ```html\n \ud83d\udcad \u062a\u0641\u06a9\u0631 \u0648 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 (\u067e\u0631\u0648\u0698\u0647: {proj_badge}):\n ```\n\n---\n\n### \u06f3. \u0627\u0639\u0644\u0627\u0646 \u0627\u062c\u0631\u0627\u06cc \u0627\u0628\u0632\u0627\u0631\u0647\u0627 (Active Tool Calls)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py#L132-L180) (\u062a\u0627\u0628\u0639 `format_tool_call`)\n* **\u0645\u062a\u0646 \u0648 \u0628\u0631\u0686\u0633\u0628 \u0627\u0628\u0632\u0627\u0631\u0647\u0627:** \u0645\u062b\u0644 \u0646\u0645\u0627\u06cc\u0634 \u0646\u0627\u0645 \u0627\u0628\u0632\u0627\u0631\u060c \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0627\u062c\u0631\u0627 \u0634\u062f\u0647 \u06cc\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0648\u06cc\u0631\u0627\u06cc\u0634\u200c\u0634\u062f\u0647.\n\n---\n\n### \u06f4. \u0641\u0648\u062a\u0631 \u0622\u0645\u0627\u0631\u06cc \u067e\u0633 \u0627\u0632 \u067e\u0627\u06cc\u0627\u0646 \u067e\u0627\u0633\u062e (Stats Footer)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py#L110-L113) (\u062a\u0627\u0628\u0639 `format_stats_footer`)\n* **\u0641\u0631\u0645\u062a \u062f\u0648 \u062e\u0637\u06cc \u0648\u0636\u0639\u06cc\u062a:**\n ```text\n [\u0646\u0627\u0645 \u067e\u0631\u0648\u0698\u0647] [\u0646\u0627\u0645 \u0645\u062f\u0644]\n CL: [\u062f\u0631\u0635\u062f \u06a9\u0627\u0646\u062a\u06a9\u0633\u062a] T: [\u062a\u0639\u062f\u0627\u062f \u062a\u0648\u06a9\u0646] D: [\u0645\u062f\u062a \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627]\n ```\n\n---\n\n\u0627\u06af\u0631 \u0645\u062a\u0646 \u06cc\u0627 \u0639\u0628\u0627\u0631\u062a \u062e\u0627\u0635\u06cc \u0645\u062f\u0646\u0638\u0631\u062a\u0627\u0646 \u0627\u0633\u062a\u060c \u0628\u0641\u0631\u0645\u0627\u06cc\u06cc\u062f \u062a\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0622\u0646 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0648 \u0631\u0648\u06cc \u0631\u0628\u0627\u062a \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u0645.\n", + "last_context_length": 22551, + "last_total_tokens": 188557, + "last_response": "\u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u0634\u0645\u0627 \u0628\u0627 \u062f\u0642\u062a \u062f\u0631 \u062a\u0645\u0627\u0645 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637\u0647 \u0627\u0639\u0645\u0627\u0644 \u0634\u062f:\n\n### \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647:\n1. **\u0646\u0634\u0627\u0646\u06af\u0631 \u0632\u0646\u062f\u0647 \u0627\u0633\u062a\u0631\u06cc\u0645 \u062a\u0641\u06a9\u0631 (Live Thinking Indicator):**\n - \u062f\u0631 \u0641\u0627\u06cc\u0644 [`/root/telegram-agy-bot/bot.py`](file:///root/telegram-agy-bot/bot.py#L6520-L6545)\u060c \u0639\u0628\u0627\u0631\u062a \u00ab\u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0631\u0648\u06cc \u067e\u0631\u0648\u0698\u0647 [\u0646\u0627\u0645 \u067e\u0631\u0648\u0698\u0647]...\u00bb \u062d\u0630\u0641 \u0648 \u0628\u0647 \u00ab\u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0628\u0627 \u0645\u062f\u0644 **[\u0646\u0627\u0645 \u0645\u062f\u0644 \u0641\u0639\u0627\u0644]**...\u00bb \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627\u0641\u062a:\n ```html\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0628\u0627 \u0645\u062f\u0644 Gemini 3.7 Flash Auto... \u258c\n ```\n2. **\u067e\u06cc\u0627\u0645 \u0627\u0648\u0644\u06cc\u0647 \u0634\u0631\u0648\u0639 \u067e\u0631\u062f\u0627\u0632\u0634:**\n - \u062f\u0631 \u0648\u0636\u0639\u06cc\u062a \u0627\u0648\u0644\u06cc\u0647 \u067e\u06cc\u0627\u0645 \u0642\u0628\u0644 \u0627\u0632 \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0648\u0644\u06cc\u0646 \u062a\u0648\u06a9\u0646 \u067e\u0627\u0633\u062e\u060c \u0646\u0627\u0645 \u0645\u062f\u0644 \u0641\u0639\u0627\u0644 \u062f\u0631\u062c \u0634\u062f:\n ```html\n \ud83d\udcc1 \u067e\u0631\u0648\u0698\u0647: \u0646\u0627\u0645_\u067e\u0631\u0648\u0698\u0647\n\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0628\u0627 \u0645\u062f\u0644 Gemini 3.7 Flash Auto...\n ```\n3. **\u0628\u0627\u06a9\u0633 \u0628\u0627\u0632\u0634\u0648\u0646\u062f\u0647 \u062a\u0641\u06a9\u0631 (Expandable Thought Blockquote):**\n - \u062f\u0631 \u062a\u0627\u0628\u0639 [`format_thought`](file:///root/telegram-agy-bot/formatters.py#L115-L135) \u0641\u0627\u06cc\u0644 [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py)\u060c \u062a\u06cc\u062a\u0631 \u062a\u0641\u06a9\u0631 \u0645\u062f\u0644 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u062f:\n ```html\n \ud83d\udcad \u062a\u0641\u06a9\u0631 \u0648 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 (\u0645\u062f\u0644: Gemini 3.7 Flash Auto):\n ```\n4. **\u062a\u0627\u0628\u0639 \u062a\u0628\u062f\u06cc\u0644 \u0648 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f\u0633\u0627\u0632\u06cc \u0646\u0627\u0645 \u0645\u062f\u0644\u200c\u0647\u0627 (`get_model_display_name`):**\n - \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062a\u0645\u06cc\u0632 \u0648 \u062e\u0648\u0627\u0646\u0627\u06cc \u0645\u062f\u0644\u200c\u0647\u0627 (\u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u0633\u0637\u062d Reasoning Effort \u0645\u0627\u0646\u0646\u062f `[High]`, `[Med]`)\u060c \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0645\u0627\u0698\u0648\u0644\u0627\u0631 \u0648 \u0628\u0647\u06cc\u0646\u0647 \u0628\u0647 \u0633\u0627\u062e\u062a\u0627\u0631 \u0641\u0631\u0645\u062a\u200c\u062f\u0647\u06cc \u0627\u0641\u0632\u0648\u062f\u0647 \u0634\u062f.\n\n\u0633\u0631\u0648\u06cc\u0633 \u0631\u0628\u0627\u062a \u062a\u0644\u06af\u0631\u0627\u0645 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0627 \u062a\u06af \u0632\u06cc\u0631 \u067e\u0633 \u0627\u0632 \u062a\u062d\u0648\u06cc\u0644 \u067e\u06cc\u0627\u0645 \u0631\u06cc\u200c\u0627\u0633\u062a\u0627\u0631\u062a \u0648 \u0641\u0639\u0627\u0644 \u0645\u06cc\u200c\u0634\u0648\u062f.\n\n[[RESTART_BOT]]\n\n\u2022 \u0646\u0627\u0645 \u067e\u0631\u0648\u0698\u0647: default\n\u2022 \u0622\u062f\u0631\u0633 \u0645\u062e\u0632\u0646: https://git.msa.artacloud.ir/root/default\n", "created_at": 1787995349.975879, "description": "" }, @@ -99,19 +99,19 @@ } }, "turn_in_progress": false, - "last_prompt": "\u0632\u0645\u0627\u0646 \u06a9\u0627\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc\n\u06cc\u06a9 \u0645\u062a\u0646 \u0632\u06cc\u0631 \u067e\u06cc\u0627\u0645 \u0632\u0646\u062f\u0647 \u0645\u06cc\u0646\u0648\u06cc\u0633\u06cc\n\u0627\u0648\u0646 \u0686\u06cc\u0633\u062a \u0628\u0647\u0645 \u0628\u06af\u0648 \u06a9\u0647 \u0645\u06cc\u062e\u0648\u0627\u0645 \u0648\u06cc\u0631\u0627\u06cc\u0634\u0634 \u06a9\u0646\u0645", - "last_response": "\u0645\u062a\u0646\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0632\u0645\u0627\u0646 \u067e\u0631\u062f\u0627\u0632\u0634 \u0632\u0646\u062f\u0647 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062f\u0631 \u0632\u06cc\u0631 \u067e\u06cc\u0627\u0645 \u062a\u0644\u06af\u0631\u0627\u0645 \u06cc\u0627 \u062f\u0631 \u0627\u0646\u062a\u0647\u0627\u06cc \u0622\u0646 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0634\u0627\u0645\u0644 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0632\u06cc\u0631 \u062f\u0631 \u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u0631\u0628\u0627\u062a \u062a\u0644\u06af\u0631\u0627\u0645 \u0647\u0633\u062a\u0646\u062f:\n\n---\n\n### \u06f1. \u0645\u062a\u0646 \u0648\u0636\u0639\u06cc\u062a \u0648 \u0646\u0634\u0627\u0646\u06af\u0631 \u0644\u0627\u06cc\u0648 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u0633\u062a\u0631\u06cc\u0645 (Live Status & Cursor)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/bot.py`](file:///root/telegram-agy-bot/bot.py#L6458-L6541)\n* **\u0645\u062a\u0646 \u0627\u0648\u0644\u06cc\u0647 (\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u067e\u0627\u0633\u062e):**\n ```html\n \ud83d\udcc1 \u067e\u0631\u0648\u0698\u0647: {curr_proj.name}\n\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0631\u0648\u06cc \u067e\u0631\u0648\u0698\u0647 {curr_proj.name}...\n ```\n *(\u062e\u0637\u0648\u0637 \u06f6\u06f4\u06f5\u06f8 \u062a\u0627 \u06f6\u06f4\u06f6\u06f6 \u0641\u0627\u06cc\u0644 [`bot.py`](file:///root/telegram-agy-bot/bot.py#L6458-L6466))*\n\n* **\u0646\u0634\u0627\u0646\u06af\u0631 \u0632\u0646\u062f\u0647 \u062a\u0641\u06a9\u0631 \u062f\u0631 \u062d\u06cc\u0646 \u062a\u0648\u0644\u06cc\u062f \u067e\u0627\u0633\u062e (\u0632\u06cc\u0631 \u0645\u062a\u0646 \u062f\u0631 \u062d\u0627\u0644 \u0627\u0633\u062a\u0631\u06cc\u0645):**\n ```html\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0631\u0648\u06cc \u067e\u0631\u0648\u0698\u0647 {curr_proj.name}... \u258c\n ```\n *(\u062e\u0637\u0648\u0637 \u06f6\u06f5\u06f2\u06f3 \u0648 \u06f6\u06f5\u06f3\u06f9 \u0641\u0627\u06cc\u0644 [`bot.py`](file:///root/telegram-agy-bot/bot.py#L6523))*\n\n* **\u0646\u0634\u0627\u0646\u06af\u0631 \u0627\u062f\u0627\u0645\u0647 \u062f\u0631 \u067e\u06cc\u0627\u0645 \u0628\u0639\u062f\u06cc (\u062f\u0631 \u0635\u0648\u0631\u062a \u0637\u0648\u0644\u0627\u0646\u06cc \u0634\u062f\u0646 \u0645\u062a\u0646):**\n ```html\n ...\n (\u0627\u062f\u0627\u0645\u0647 \u062f\u0631 \u067e\u06cc\u0627\u0645 \u0628\u0639\u062f\u06cc...)\n ```\n *(\u062e\u0637 \u06f6\u06f5\u06f4\u06f7 \u0641\u0627\u06cc\u0644 [`bot.py`](file:///root/telegram-agy-bot/bot.py#L6547))*\n\n---\n\n### \u06f2. \u0628\u0627\u06a9\u0633 \u062a\u0641\u06a9\u0631 \u0648 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0645\u062f\u0644 (Thinking Blockquote)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py#L115-L130) (\u062a\u0627\u0628\u0639 `format_thought`)\n* **\u0645\u062a\u0646 \u062a\u06cc\u062a\u0631 \u0628\u0627\u06a9\u0633 \u062a\u0641\u06a9\u0631 \u062c\u0645\u0639\u200c\u0634\u0648\u0646\u062f\u0647:**\n ```html\n \ud83d\udcad \u062a\u0641\u06a9\u0631 \u0648 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 (\u067e\u0631\u0648\u0698\u0647: {proj_badge}):\n ```\n\n---\n\n### \u06f3. \u0627\u0639\u0644\u0627\u0646 \u0627\u062c\u0631\u0627\u06cc \u0627\u0628\u0632\u0627\u0631\u0647\u0627 (Active Tool Calls)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py#L132-L180) (\u062a\u0627\u0628\u0639 `format_tool_call`)\n* **\u0645\u062a\u0646 \u0648 \u0628\u0631\u0686\u0633\u0628 \u0627\u0628\u0632\u0627\u0631\u0647\u0627:** \u0645\u062b\u0644 \u0646\u0645\u0627\u06cc\u0634 \u0646\u0627\u0645 \u0627\u0628\u0632\u0627\u0631\u060c \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0627\u062c\u0631\u0627 \u0634\u062f\u0647 \u06cc\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0648\u06cc\u0631\u0627\u06cc\u0634\u200c\u0634\u062f\u0647.\n\n---\n\n### \u06f4. \u0641\u0648\u062a\u0631 \u0622\u0645\u0627\u0631\u06cc \u067e\u0633 \u0627\u0632 \u067e\u0627\u06cc\u0627\u0646 \u067e\u0627\u0633\u062e (Stats Footer)\n* **\u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644:** [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py#L110-L113) (\u062a\u0627\u0628\u0639 `format_stats_footer`)\n* **\u0641\u0631\u0645\u062a \u062f\u0648 \u062e\u0637\u06cc \u0648\u0636\u0639\u06cc\u062a:**\n ```text\n [\u0646\u0627\u0645 \u067e\u0631\u0648\u0698\u0647] [\u0646\u0627\u0645 \u0645\u062f\u0644]\n CL: [\u062f\u0631\u0635\u062f \u06a9\u0627\u0646\u062a\u06a9\u0633\u062a] T: [\u062a\u0639\u062f\u0627\u062f \u062a\u0648\u06a9\u0646] D: [\u0645\u062f\u062a \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627]\n ```\n\n---\n\n\u0627\u06af\u0631 \u0645\u062a\u0646 \u06cc\u0627 \u0639\u0628\u0627\u0631\u062a \u062e\u0627\u0635\u06cc \u0645\u062f\u0646\u0638\u0631\u062a\u0627\u0646 \u0627\u0633\u062a\u060c \u0628\u0641\u0631\u0645\u0627\u06cc\u06cc\u062f \u062a\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0622\u0646 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0648 \u0631\u0648\u06cc \u0631\u0628\u0627\u062a \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u0645.\n", + "last_prompt": "\u062e\u0628 \u0631\u0648\u06cc \u0646\u0634\u0627\u0646\u06af\u0631 \u0632\u0646\u062f\u0647 \u062a\u0641\u06a9\u0631 \u0627\u0633\u0645 \u067e\u0631\u0648\u0698\u0647 \u0631\u0648 \u0646\u0646\u0648\u06cc\u0633 \u0648 \u0628\u0647 \u062c\u0627\u0634 \u0628\u06af\u0648 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0638\u0631 \u062f\u0627\u0631\u0647 \u0627\u0632 \u0686\u0647 \u0645\u062f\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u06a9\u0646\u0647\n\u0627\u06cc\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0686\u0646\u062f \u062c\u0627 \u0628\u0627\u0634\u062f", + "last_response": "\u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u0634\u0645\u0627 \u0628\u0627 \u062f\u0642\u062a \u062f\u0631 \u062a\u0645\u0627\u0645 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637\u0647 \u0627\u0639\u0645\u0627\u0644 \u0634\u062f:\n\n### \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647:\n1. **\u0646\u0634\u0627\u0646\u06af\u0631 \u0632\u0646\u062f\u0647 \u0627\u0633\u062a\u0631\u06cc\u0645 \u062a\u0641\u06a9\u0631 (Live Thinking Indicator):**\n - \u062f\u0631 \u0641\u0627\u06cc\u0644 [`/root/telegram-agy-bot/bot.py`](file:///root/telegram-agy-bot/bot.py#L6520-L6545)\u060c \u0639\u0628\u0627\u0631\u062a \u00ab\u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0631\u0648\u06cc \u067e\u0631\u0648\u0698\u0647 [\u0646\u0627\u0645 \u067e\u0631\u0648\u0698\u0647]...\u00bb \u062d\u0630\u0641 \u0648 \u0628\u0647 \u00ab\u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0628\u0627 \u0645\u062f\u0644 **[\u0646\u0627\u0645 \u0645\u062f\u0644 \u0641\u0639\u0627\u0644]**...\u00bb \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627\u0641\u062a:\n ```html\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0628\u0627 \u0645\u062f\u0644 Gemini 3.7 Flash Auto... \u258c\n ```\n2. **\u067e\u06cc\u0627\u0645 \u0627\u0648\u0644\u06cc\u0647 \u0634\u0631\u0648\u0639 \u067e\u0631\u062f\u0627\u0632\u0634:**\n - \u062f\u0631 \u0648\u0636\u0639\u06cc\u062a \u0627\u0648\u0644\u06cc\u0647 \u067e\u06cc\u0627\u0645 \u0642\u0628\u0644 \u0627\u0632 \u062f\u0631\u06cc\u0627\u0641\u062a \u0627\u0648\u0644\u06cc\u0646 \u062a\u0648\u06a9\u0646 \u067e\u0627\u0633\u062e\u060c \u0646\u0627\u0645 \u0645\u062f\u0644 \u0641\u0639\u0627\u0644 \u062f\u0631\u062c \u0634\u062f:\n ```html\n \ud83d\udcc1 \u067e\u0631\u0648\u0698\u0647: \u0646\u0627\u0645_\u067e\u0631\u0648\u0698\u0647\n\n \ud83d\udcad \u062f\u0631 \u062d\u0627\u0644 \u062a\u0641\u06a9\u0631 \u0628\u0627 \u0645\u062f\u0644 Gemini 3.7 Flash Auto...\n ```\n3. **\u0628\u0627\u06a9\u0633 \u0628\u0627\u0632\u0634\u0648\u0646\u062f\u0647 \u062a\u0641\u06a9\u0631 (Expandable Thought Blockquote):**\n - \u062f\u0631 \u062a\u0627\u0628\u0639 [`format_thought`](file:///root/telegram-agy-bot/formatters.py#L115-L135) \u0641\u0627\u06cc\u0644 [`/root/telegram-agy-bot/formatters.py`](file:///root/telegram-agy-bot/formatters.py)\u060c \u062a\u06cc\u062a\u0631 \u062a\u0641\u06a9\u0631 \u0645\u062f\u0644 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u062f:\n ```html\n \ud83d\udcad \u062a\u0641\u06a9\u0631 \u0648 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 (\u0645\u062f\u0644: Gemini 3.7 Flash Auto):\n ```\n4. **\u062a\u0627\u0628\u0639 \u062a\u0628\u062f\u06cc\u0644 \u0648 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f\u0633\u0627\u0632\u06cc \u0646\u0627\u0645 \u0645\u062f\u0644\u200c\u0647\u0627 (`get_model_display_name`):**\n - \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062a\u0645\u06cc\u0632 \u0648 \u062e\u0648\u0627\u0646\u0627\u06cc \u0645\u062f\u0644\u200c\u0647\u0627 (\u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u0633\u0637\u062d Reasoning Effort \u0645\u0627\u0646\u0646\u062f `[High]`, `[Med]`)\u060c \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0645\u0627\u0698\u0648\u0644\u0627\u0631 \u0648 \u0628\u0647\u06cc\u0646\u0647 \u0628\u0647 \u0633\u0627\u062e\u062a\u0627\u0631 \u0641\u0631\u0645\u062a\u200c\u062f\u0647\u06cc \u0627\u0641\u0632\u0648\u062f\u0647 \u0634\u062f.\n\n\u0633\u0631\u0648\u06cc\u0633 \u0631\u0628\u0627\u062a \u062a\u0644\u06af\u0631\u0627\u0645 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0627 \u062a\u06af \u0632\u06cc\u0631 \u067e\u0633 \u0627\u0632 \u062a\u062d\u0648\u06cc\u0644 \u067e\u06cc\u0627\u0645 \u0631\u06cc\u200c\u0627\u0633\u062a\u0627\u0631\u062a \u0648 \u0641\u0639\u0627\u0644 \u0645\u06cc\u200c\u0634\u0648\u062f.\n\n[[RESTART_BOT]]\n\n\u2022 \u0646\u0627\u0645 \u067e\u0631\u0648\u0698\u0647: default\n\u2022 \u0622\u062f\u0631\u0633 \u0645\u062e\u0632\u0646: https://git.msa.artacloud.ir/root/default\n", "last_status_msg_id": null, "restart_pending": false, "last_delivered": true, - "last_update_time": 1788081424.6915243, + "last_update_time": 1788081635.6170475, "workspace": "/root", "conversation_id": "b07a79ef-8da0-4688-b71a-86c8629803f5", "model": "gemini-3.7-flash-auto", "effort": "high", "language": "fa", - "last_context_length": 5323, - "last_total_tokens": 46412 + "last_context_length": 22551, + "last_total_tokens": 188557 }, "232801087": { "chat_id": 232801087,