feat: sichtbarer Fortschritt + echter Abbruch fuer lange Suchen
- Alle 30s Statusmeldung waehrend laufender Suche - Textbefehl "abbruch"/"stop" cancelt den laufenden Such-Task - Aufraeumen via Task-Registry pro Chat - Sauberes Cancel-Handling ohne Tracebacks
This commit is contained in:
parent
8e69189781
commit
d189f8adac
1 changed files with 47 additions and 2 deletions
|
|
@ -117,6 +117,7 @@ log = logging.getLogger("hausmeister")
|
||||||
|
|
||||||
ALLOWED_CHAT_IDS: set[int] = set()
|
ALLOWED_CHAT_IDS: set[int] = set()
|
||||||
CHAT_ID: int | None = None
|
CHAT_ID: int | None = None
|
||||||
|
ACTIVE_LLM_TASKS: dict[int, asyncio.Task] = {}
|
||||||
|
|
||||||
|
|
||||||
def _load_token_and_chat():
|
def _load_token_and_chat():
|
||||||
|
|
@ -167,6 +168,9 @@ async def cmd_status(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
if len(text) > 4000:
|
if len(text) > 4000:
|
||||||
text = text[:4000] + "\n..."
|
text = text[:4000] + "\n..."
|
||||||
await update.message.reply_text(text)
|
await update.message.reply_text(text)
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
log.info("Freitext-Lauf abgebrochen")
|
||||||
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
await update.message.reply_text(f"Fehler: {e}")
|
await update.message.reply_text(f"Fehler: {e}")
|
||||||
|
|
||||||
|
|
@ -409,7 +413,20 @@ async def handle_voice(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
context.last_suggest_result = {"type": None}
|
context.last_suggest_result = {"type": None}
|
||||||
context.set_source_type("telegram_voice")
|
context.set_source_type("telegram_voice")
|
||||||
handlers = context.get_tool_handlers(session_id=session_id)
|
handlers = context.get_tool_handlers(session_id=session_id)
|
||||||
answer = await asyncio.to_thread(llm.ask_with_tools, text, handlers, session_id=session_id)
|
llm_task = asyncio.create_task(
|
||||||
|
asyncio.to_thread(llm.ask_with_tools, text, handlers, session_id=session_id)
|
||||||
|
)
|
||||||
|
ACTIVE_LLM_TASKS[update.effective_chat.id] = llm_task
|
||||||
|
|
||||||
|
waited = 0
|
||||||
|
while not llm_task.done():
|
||||||
|
await asyncio.sleep(30)
|
||||||
|
waited += 30
|
||||||
|
if not llm_task.done():
|
||||||
|
await update.message.reply_text("⏳ Suche laeuft noch (" + str(waited) + "s)...")
|
||||||
|
|
||||||
|
answer = await llm_task
|
||||||
|
|
||||||
if session_id:
|
if session_id:
|
||||||
memory_client.log_message(session_id, "user", text)
|
memory_client.log_message(session_id, "user", text)
|
||||||
memory_client.log_message(session_id, "assistant", answer)
|
memory_client.log_message(session_id, "assistant", answer)
|
||||||
|
|
@ -711,6 +728,16 @@ async def handle_message(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
if not text:
|
if not text:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if text.strip().lower() in ("abbruch", "stop", "stopp", "cancel"):
|
||||||
|
chat_id = update.effective_chat.id
|
||||||
|
task = ACTIVE_LLM_TASKS.get(chat_id)
|
||||||
|
if task and not task.done():
|
||||||
|
task.cancel()
|
||||||
|
await update.message.reply_text("🛑 Abgebrochen.")
|
||||||
|
else:
|
||||||
|
await update.message.reply_text("Kein laufender Suchlauf.")
|
||||||
|
return
|
||||||
|
|
||||||
cmd = BUTTON_MAP.get(text)
|
cmd = BUTTON_MAP.get(text)
|
||||||
if cmd == "status":
|
if cmd == "status":
|
||||||
return await cmd_status(update, ctx)
|
return await cmd_status(update, ctx)
|
||||||
|
|
@ -735,7 +762,20 @@ async def handle_message(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
context.last_suggest_result = {"type": None}
|
context.last_suggest_result = {"type": None}
|
||||||
context.set_source_type("telegram_text")
|
context.set_source_type("telegram_text")
|
||||||
handlers = context.get_tool_handlers(session_id=session_id)
|
handlers = context.get_tool_handlers(session_id=session_id)
|
||||||
answer = await asyncio.to_thread(llm.ask_with_tools, text, handlers, session_id=session_id)
|
llm_task = asyncio.create_task(
|
||||||
|
asyncio.to_thread(llm.ask_with_tools, text, handlers, session_id=session_id)
|
||||||
|
)
|
||||||
|
ACTIVE_LLM_TASKS[update.effective_chat.id] = llm_task
|
||||||
|
|
||||||
|
waited = 0
|
||||||
|
while not llm_task.done():
|
||||||
|
await asyncio.sleep(30)
|
||||||
|
waited += 30
|
||||||
|
if not llm_task.done():
|
||||||
|
await update.message.reply_text("Suche laeuft noch (" + str(waited) + "s)...")
|
||||||
|
|
||||||
|
answer = await llm_task
|
||||||
|
|
||||||
if session_id:
|
if session_id:
|
||||||
memory_client.log_message(session_id, "user", text)
|
memory_client.log_message(session_id, "user", text)
|
||||||
memory_client.log_message(session_id, "assistant", answer)
|
memory_client.log_message(session_id, "assistant", answer)
|
||||||
|
|
@ -744,9 +784,14 @@ async def handle_message(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
log.info("suggest_result: type=%s", suggest.get("type"))
|
log.info("suggest_result: type=%s", suggest.get("type"))
|
||||||
|
|
||||||
await update.message.reply_text(answer[:4000], reply_markup=KEYBOARD)
|
await update.message.reply_text(answer[:4000], reply_markup=KEYBOARD)
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
log.info("Freitext-Lauf abgebrochen")
|
||||||
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.exception("Fehler bei Freitext")
|
log.exception("Fehler bei Freitext")
|
||||||
await update.message.reply_text(f"Fehler: {e}")
|
await update.message.reply_text(f"Fehler: {e}")
|
||||||
|
finally:
|
||||||
|
ACTIVE_LLM_TASKS.pop(update.effective_chat.id, None)
|
||||||
|
|
||||||
|
|
||||||
async def handle_callback(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
async def handle_callback(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue