Spaces:
Running
Running
| """Patch agent_loop.py - detect task incomplete and send event.""" | |
| AGENT_LOOP = "/app/agent/core/agent_loop.py" | |
| def patch(): | |
| import os | |
| if not os.path.exists(AGENT_LOOP): | |
| print(f"SKIP: {AGENT_LOOP} not found") | |
| return | |
| with open(AGENT_LOOP, "r", encoding="utf-8") as f: | |
| content = f.read() | |
| # Add _check_task_incomplete function before class Handlers | |
| check_func = ''' | |
| def _check_task_incomplete(session: Session, llm_result: LLMResult) -> bool: | |
| """Check if model stopped streaming but task is incomplete.""" | |
| if llm_result.tool_calls_acc: | |
| return False # Has tool calls, task continues via tool execution | |
| plan = getattr(session, "current_plan", None) or [] | |
| unfinished = [item for item in plan if item.get("status") in ("pending", "in_progress")] | |
| return len(unfinished) > 0 | |
| def _unfinished_plan_items(session: Session) -> list[dict[str, str]]: | |
| """Helper to get unfinished plan items.""" | |
| plan = getattr(session, "current_plan", None) or [] | |
| return [item for item in plan if item.get("status") in ("pending", "in_progress")] | |
| ''' | |
| if "_check_task_incomplete" not in content: | |
| content = content.replace( | |
| "class Handlers:", | |
| check_func + "\n\nclass Handlers:" | |
| ) | |
| # Add the check after LLM response processing | |
| check_call = ''' | |
| # === Check for incomplete task after LLM response === | |
| if not llm_result.tool_calls_acc and llm_result.content: | |
| unfinished = _unfinished_plan_items(session) | |
| if unfinished: | |
| await session.send_event( | |
| Event( | |
| event_type="task_incomplete", | |
| data={ | |
| "incomplete_plan": unfinished, | |
| "message": "Model phản hồi đã dừng nhưng nhiệm vụ chưa hoàn thành." | |
| } | |
| ) | |
| ) | |
| ''' | |
| if "task_incomplete" not in content: | |
| # Find a good insertion point - after tool calls processing | |
| insert_marker = " # -- End of turn --" | |
| if insert_marker in content: | |
| content = content.replace(insert_marker, check_call + "\n" + insert_marker) | |
| else: | |
| # Try another location | |
| result_marker = "final_response = llm_result.content or None" | |
| if result_marker in content: | |
| content = content.replace(result_marker, result_marker + "\n" + check_call) | |
| with open(AGENT_LOOP, "w", encoding="utf-8") as f: | |
| f.write(content) | |
| print(f"OK: Patched {AGENT_LOOP}") | |
| if __name__ == "__main__": | |
| patch() |