Source code for langchain_google_community.calendar.search_events
"""Search an event in Google Calendar."""importjsonfromdatetimeimportdatetimefromtypingimportAny,Dict,List,Optional,Typefromlangchain_core.callbacksimportCallbackManagerForToolRunfrompydanticimportBaseModel,FieldfromzoneinfoimportZoneInfofromlangchain_google_community.calendar.baseimportCalendarBaseTool
[docs]classSearchEventsSchema(BaseModel):"""Input for CalendarSearchEvents."""calendars_info:str=Field(...,description=("A list with the information about all Calendars in Google Calendar""Use the tool 'get_calendars_info' to get it."),)min_datetime:str=Field(...,description=("The start datetime for the events in 'YYYY-MM-DD HH:MM:SS' format. ""If you do not know the current datetime, use the tool to get it."),)max_datetime:str=Field(...,description="The end datetime for the events search.")max_results:int=Field(default=10,description="The maximum number of results to return.")single_events:bool=Field(default=True,description=("Whether to expand recurring events into instances and only return single ""one-off events and instances of recurring events.""'startTime' or 'updated'."),)order_by:str=Field(default="startTime",description="The order of the events, either 'startTime' or 'updated'.",)query:Optional[str]=Field(default=None,description=("Free text search terms to find events, ""that match these terms in the following fields: ""summary, description, location, attendee's displayName, attendee's email, ""organizer's displayName, organizer's email."),)
[docs]classCalendarSearchEvents(CalendarBaseTool):# type: ignore[override, override]"""Tool that retrieves events from Google Calendar."""name:str="search_events"description:str="Use this tool to search events in the calendar."args_schema:Type[SearchEventsSchema]=SearchEventsSchemadef_get_calendar_timezone(self,calendars_info:List[Dict[str,str]],calendar_id:str)->Optional[str]:"""Get the timezone of the current calendar."""forcalincalendars_info:ifcal["id"]==calendar_id:returncal.get("timeZone")returnNonedef_get_calendar_ids(self,calendars_info:List[Dict[str,str]])->List[str]:"""Get the calendar IDs."""return[cal["id"]forcalincalendars_info]def_process_data_events(self,events_data:List[Dict[str,Any]])->List[Dict[str,Optional[str]]]:"""Process the data events."""simplified_data=[]fordatainevents_data:event_dict={"id":data.get("id"),"htmlLink":data.get("htmlLink"),"summary":data.get("summary"),"creator":data.get("creator",{}).get("email"),"organizer":data.get("organizer",{}).get("email"),"start":data.get("start",{}).get("dateTime")ordata.get("start",{}).get("date"),"end":data.get("end",{}).get("dateTime")ordata.get("end",{}).get("date"),}simplified_data.append(event_dict)returnsimplified_datadef_run(self,calendars_info:str,min_datetime:str,max_datetime:str,max_results:int=10,single_events:bool=True,order_by:str="startTime",query:Optional[str]=None,run_manager:Optional[CallbackManagerForToolRun]=None,)->List[Dict[str,Optional[str]]]:"""Run the tool to search events in Google Calendar."""try:calendars_data=json.loads(calendars_info)calendars=self._get_calendar_ids(calendars_data)events=[]forcalendarincalendars:tz_name=self._get_calendar_timezone(calendars_data,calendar)calendar_tz=ZoneInfo(tz_name)iftz_nameelseNonetime_min=(datetime.strptime(min_datetime,"%Y-%m-%d %H:%M:%S").astimezone(calendar_tz).isoformat())time_max=(datetime.strptime(max_datetime,"%Y-%m-%d %H:%M:%S").astimezone(calendar_tz).isoformat())events_result=(self.api_resource.events().list(calendarId=calendar,timeMin=time_min,timeMax=time_max,maxResults=max_results,singleEvents=single_events,orderBy=order_by,q=query,).execute())cal_events=events_result.get("items",[])events.extend(cal_events)returnself._process_data_events(events)exceptExceptionaserror:raiseException(f"An error occurred while fetching events: {error}")fromerror