From 99faa1eecbbdd7614982de405726e25f5b33da0b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 23:25:52 +0000 Subject: [PATCH] feat: Implement LLM and scheduler functionalities This commit finalizes Phase 4 of the project by implementing the LLM and scheduler integrations. - Implements `get_smart_response` in `app/llm.py` to generate AI-powered responses using the OpenAI API. - Implements a daily summary scheduler in `app/scheduler.py` using the `JobQueue` from `python-telegram-bot` for better integration with the application's event loop. - Adds `get_events_for_day` to `app/calendar.py` to fetch daily events for the summary. - Integrates the scheduler into the main application loop in `app/main.py`. - Improves the date formatting in the daily summary for better readability. - Updates `tasks.md` to reflect the completion of Phase 4. --- app/calendar.py | 25 ++++++++++++++++++++ app/llm.py | 21 +++++++++++++---- app/main.py | 4 ++++ app/scheduler.py | 59 ++++++++++++++++++++++++++++++++++-------------- tasks.md | 4 ++-- 5 files changed, 89 insertions(+), 24 deletions(-) diff --git a/app/calendar.py b/app/calendar.py index a90662b..6bd911b 100644 --- a/app/calendar.py +++ b/app/calendar.py @@ -89,3 +89,28 @@ def create_event(summary, start_time, end_time, attendees, calendar_id=CALENDAR_ except HttpError as error: print(f"An error occurred: {error}") return None + + +def get_events_for_day(date, calendar_id=CALENDAR_ID): + """ + Fetches all events for a given day from the calendar. + """ + try: + time_min = date.isoformat() + "T00:00:00Z" + time_max = date.isoformat() + "T23:59:59Z" + + events_result = ( + service.events() + .list( + calendarId=calendar_id, + timeMin=time_min, + timeMax=time_max, + singleEvents=True, + orderBy="startTime", + ) + .execute() + ) + return events_result.get("items", []) + except HttpError as error: + print(f"An error occurred: {error}") + return [] diff --git a/app/llm.py b/app/llm.py index 7d79bb6..d5c4e38 100644 --- a/app/llm.py +++ b/app/llm.py @@ -1,15 +1,26 @@ # app/llm.py -from config import OPENAI_API_KEY +import openai +from app.config import OPENAI_API_KEY def get_smart_response(prompt): """ Generates a smart response using an LLM. """ - if not OPENAI_API_KEY: return "OpenAI API key not configured." - print(f"Generating smart response for: {prompt}") - # TODO: Implement OpenAI API integration - return "This is a smart response." + openai.api_key = OPENAI_API_KEY + + try: + response = openai.ChatCompletion.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": prompt}, + ], + ) + return response.choices[0].message.content.strip() + except Exception as e: + print(f"An error occurred with OpenAI: {e}") + return "I'm sorry, I couldn't generate a response right now." diff --git a/app/main.py b/app/main.py index 06b31ff..e88ec84 100644 --- a/app/main.py +++ b/app/main.py @@ -28,6 +28,7 @@ from modules.equipo import ( from modules.aprobaciones import view_pending, handle_approval_action from modules.servicios import get_service_info from modules.admin import get_system_status +from app.scheduler import setup_scheduler # Enable logging logging.basicConfig( @@ -103,6 +104,9 @@ def main() -> None: application.add_handler(CommandHandler("start", start)) application.add_handler(CallbackQueryHandler(button_dispatcher)) + # Set up the scheduler + setup_scheduler(application) + logger.info("Starting Talía Bot...") application.run_polling() diff --git a/app/scheduler.py b/app/scheduler.py index 1996809..4fc791f 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -1,27 +1,52 @@ # app/scheduler.py -import schedule -import time -from datetime import datetime +import datetime +import pytz +from telegram import Bot +from app.config import OWNER_CHAT_ID, TIMEZONE +from app.calendar import get_events_for_day -from config import TIMEZONE -def send_daily_summary(): +def format_event_time(start_time_str): + """ + Formats the event start time into a user-friendly format. + """ + if "T" in start_time_str: # It's a dateTime + dt_object = datetime.datetime.fromisoformat(start_time_str) + return dt_object.strftime("%I:%M %p") + else: # It's a date + return "All day" + + +async def send_daily_summary(context): """ Sends the daily summary to the owner. """ - print(f"[{datetime.now()}] Sending daily summary...") - # TODO: Implement the logic to fetch and send the summary + bot = context.bot + today = datetime.datetime.now(pytz.timezone(TIMEZONE)).date() + events = get_events_for_day(today) -def main(): + if not events: + summary = "Good morning! You have no events scheduled for today." + else: + summary = "Good morning! Here is your schedule for today:\n\n" + for event in events: + start = event["start"].get("dateTime", event["start"].get("date")) + formatted_time = format_event_time(start) + summary += f"- {event['summary']} at {formatted_time}\n" + + await bot.send_message(chat_id=OWNER_CHAT_ID, text=summary) + + +def setup_scheduler(application): """ - Main function to run the scheduler. + Sets up the daily summary job. """ - schedule.every().day.at("07:00").do(send_daily_summary) - - while True: - schedule.run_pending() - time.sleep(1) - -if __name__ == "__main__": - main() + tz = pytz.timezone(TIMEZONE) + job_queue = application.job_queue + job_queue.run_daily( + send_daily_summary, + time=datetime.time(hour=7, minute=0, tzinfo=tz), + chat_id=OWNER_CHAT_ID, + name="daily_summary", + ) diff --git a/tasks.md b/tasks.md index 0dbd977..78a7859 100644 --- a/tasks.md +++ b/tasks.md @@ -30,8 +30,8 @@ This file tracks the development tasks for the Talía project. ## Phase 4: Integrations - [x] Implement `calendar.py` for Google Calendar integration. -- [ ] Implement `llm.py` for AI-powered responses. -- [ ] Implement `scheduler.py` for daily summaries. +- [x] Implement `llm.py` for AI-powered responses. +- [x] Implement `scheduler.py` for daily summaries. ## Log