Spaces:
Sleeping
Sleeping
| # agent.py | |
| import json | |
| from typing import Dict, Any | |
| from re_act import ( | |
| get_plan_from_llm, | |
| think, | |
| act, | |
| store_name_email_mapping, | |
| extract_sender_info, | |
| client | |
| ) | |
| from schemas import PlanStep | |
| from logger import logger # from logger.py | |
| def run_agent(): | |
| """ | |
| Main REPL loop for the email agent. | |
| """ | |
| logger.info("Starting Email Agent REPL...") | |
| print("π€ Email Agent ready. Type 'exit' to quit.\n") | |
| while True: | |
| try: | |
| user_query = input("π¨ You: ").strip() | |
| logger.info("Received user input: %s", user_query) | |
| if user_query.lower() in ("exit", "quit"): | |
| logger.info("Exit command detected, shutting down agent.") | |
| print("π Goodbye!") | |
| break | |
| # 1) Generate plan | |
| try: | |
| plan = get_plan_from_llm(user_query) | |
| logger.debug("Generated plan: %s", plan) | |
| except Exception as e: | |
| logger.error("Failed to generate plan: %s", e) | |
| print(f"β Could not generate a plan: {e}") | |
| continue | |
| # print plan for user transparency | |
| print("\n\n plan:") | |
| print(plan) | |
| print("\n\n") | |
| results: Dict[str, Any] = {} | |
| # 2) Execute each plan step | |
| for step in plan.plan: | |
| logger.info("Processing step: %s", step.action) | |
| if step.action == "done": | |
| logger.info("Encountered 'done' action. Plan complete.") | |
| print("β Plan complete.") | |
| break | |
| try: | |
| should_run, updated_step, user_prompt = think(step, results, user_query) | |
| logger.debug( | |
| "Think outcome for '%s': should_run=%s, updated_step=%s, user_prompt=%s", | |
| step.action, should_run, updated_step, user_prompt | |
| ) | |
| except Exception as e: | |
| logger.error("Error in think() for step '%s': %s", step.action, e) | |
| print(f"β Error in planning step '{step.action}': {e}") | |
| break | |
| # Handle user prompt (e.g., missing email mapping) | |
| if user_prompt: | |
| logger.info("User prompt required: %s", user_prompt) | |
| print(f"β {user_prompt}") | |
| user_input = input("π§ Email: ").strip() | |
| try: | |
| sender_info = extract_sender_info(user_query) | |
| sender_intent = sender_info.get("sender_intent", "") | |
| store_name_email_mapping(sender_intent, user_input) | |
| logger.info("Stored mapping: %s -> %s", sender_intent, user_input) | |
| print(f"β Stored mapping: {sender_intent} β {user_input}") | |
| # Retry current step | |
| should_run, updated_step, _ = think(step, results, user_query) | |
| logger.debug( | |
| "Post-mapping think outcome: should_run=%s, updated_step=%s", | |
| should_run, updated_step | |
| ) | |
| except Exception as e: | |
| logger.error("Error storing mapping or retrying step '%s': %s", step.action, e) | |
| print(f"β Error storing mapping or retrying step: {e}") | |
| break | |
| if not should_run: | |
| logger.info("Skipping step: %s", step.action) | |
| print(f"βοΈ Skipping `{step.action}`") | |
| continue | |
| # Execute the action | |
| try: | |
| output = act(updated_step) | |
| results[updated_step.action] = output | |
| logger.info("Action '%s' executed successfully.", updated_step.action) | |
| print(f"π§ Ran `{updated_step.action}` β {output}") | |
| except Exception as e: | |
| logger.error("Error executing action '%s': %s", updated_step.action, e) | |
| print(f"β Error running `{updated_step.action}`: {e}") | |
| break | |
| # 3) Summarize results via LLM | |
| try: | |
| summary_rsp = client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| temperature=0.0, | |
| messages=[ | |
| {"role": "system", "content": "Summarize these results for the user in a friendly way."}, | |
| {"role": "assistant", "content": json.dumps(results)} | |
| ], | |
| ) | |
| summary = summary_rsp.choices[0].message.content | |
| logger.info("Summary generated successfully.") | |
| print("\nπ Summary:\n" + summary) | |
| except Exception as e: | |
| logger.error("Failed to generate summary: %s", e) | |
| print("\nβ Failed to generate summary.") | |
| print("\nAnything else I can help you with?\n") | |
| except KeyboardInterrupt: | |
| logger.info("KeyboardInterrupt received, shutting down.") | |
| print("\nπ Goodbye!") | |
| break | |
| except Exception as e: | |
| logger.exception("Unexpected error in REPL loop: %s", e) | |
| print(f"β Unexpected error: {e}") | |
| continue | |
| if __name__ == "__main__": | |
| run_agent() | |