Skip to content

Commit e0e1975

Browse files
committed
Fixed issues with the current notetaker implementation
1 parent 0e5ac3d commit e0e1975

File tree

6 files changed

+210
-82
lines changed

6 files changed

+210
-82
lines changed

examples/notetaker_api_demo/notetaker_demo.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import sys
33
import json
44
from nylas import Client
5-
from nylas.models.notetakers import NotetakerMeetingSettings, NotetakerState, InviteNotetakerRequest
5+
from nylas.models.notetakers import NotetakerMeetingSettingsRequest, NotetakerState, InviteNotetakerRequest
66
from nylas.models.errors import NylasApiError
77

88
# Initialize the Nylas client
@@ -92,18 +92,18 @@ def get_notetaker_media(notetaker_id):
9292
print(f"Unexpected error in get_notetaker_media: {str(e)}")
9393
raise
9494

95-
def cancel_notetaker(notetaker_id):
96-
"""Demonstrates how to cancel a Notetaker."""
97-
print("\n=== Canceling Notetaker ===")
95+
def leave_notetaker(notetaker_id):
96+
"""Demonstrates how to leave a Notetaker."""
97+
print("\n=== Leaving Notetaker ===")
9898

9999
try:
100-
nylas.notetakers.cancel(notetaker_id)
101-
print(f"Cancelled Notetaker with ID: {notetaker_id}")
100+
nylas.notetakers.leave(notetaker_id)
101+
print(f"Left Notetaker with ID: {notetaker_id}")
102102
except NylasApiError as e:
103-
print(f"Error canceling notetaker: {str(e)}")
103+
print(f"Error leaving notetaker: {str(e)}")
104104
raise
105105
except Exception as e:
106-
print(f"Unexpected error in cancel_notetaker: {str(e)}")
106+
print(f"Unexpected error in leave_notetaker: {str(e)}")
107107
raise
108108

109109
def main():
@@ -125,8 +125,8 @@ def main():
125125
if notetaker.data.state == NotetakerState.MEDIA_AVAILABLE:
126126
get_notetaker_media(notetaker.data.id)
127127

128-
# Cancel the Notetaker
129-
cancel_notetaker(notetaker.data.id)
128+
# Leave the Notetaker
129+
leave_notetaker(notetaker.data.id)
130130

131131
except NylasApiError as e:
132132
print(f"\nNylas API Error: {str(e)}")

examples/notetaker_calendar_demo/notetaker_calendar_demo.py

Lines changed: 117 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
import os
22
from datetime import datetime, timedelta
3+
from typing import Optional
34

45
from nylas import Client
5-
from nylas.models.notetakers import NotetakerMeetingSettings, MeetingProvider
6-
from nylas.models.events import EventMetadata
6+
from nylas.models.notetakers import Notetaker
7+
from nylas.models.events import (
8+
UpdateEventRequest,
9+
CreateEventRequest,
10+
EventNotetakerRequest,
11+
EventNotetakerSettings,
12+
CreateTimespan,
13+
CreateEventQueryParams,
14+
UpdateEventQueryParams,
15+
CreateAutocreate,
16+
CreateEventNotetaker
17+
)
718

819
# Initialize the Nylas client
920
nylas = Client(
@@ -18,92 +29,147 @@ def create_event_with_notetaker():
1829
# Create the event
1930
start_time = datetime.now() + timedelta(days=1)
2031
end_time = start_time + timedelta(hours=1)
21-
22-
event = nylas.events.create(
32+
33+
34+
# Create the request body with proper types
35+
request_body = CreateEventRequest(
2336
title="Project Planning Meeting",
2437
description="Initial project planning and resource allocation",
25-
start_time=start_time,
26-
end_time=end_time,
27-
metadata=EventMetadata(
28-
project_id="PROJ-123",
29-
priority="high"
38+
when=CreateTimespan(
39+
start_time=int(start_time.timestamp()),
40+
end_time=int(end_time.timestamp())
41+
),
42+
metadata={
43+
"project_id": "PROJ-123",
44+
"priority": "high"
45+
},
46+
conferencing=CreateAutocreate(
47+
provider="Google Meet",
48+
autocreate={}
49+
),
50+
notetaker=CreateEventNotetaker(
51+
name="Nylas Notetaker",
52+
meeting_settings=EventNotetakerSettings(
53+
video_recording=True,
54+
audio_recording=True,
55+
transcription=True
56+
)
3057
)
3158
)
3259

33-
# Create a Notetaker bot for the event
34-
notetaker = nylas.notetakers.invite(
35-
meeting_link=event.conferencing.details.meeting_url,
36-
name="Project Planning Notetaker",
37-
meeting_settings=NotetakerMeetingSettings(
38-
video_recording=True,
39-
audio_recording=True,
40-
transcription=True
41-
)
60+
# Create the query parameters
61+
query_params = CreateEventQueryParams(
62+
calendar_id=os.getenv("NYLAS_CALENDAR_ID")
4263
)
4364

44-
print(f"Created event with ID: {event.id}")
45-
print(f"Created Notetaker with ID: {notetaker.id}")
46-
return event, notetaker
65+
event = nylas.events.create(
66+
identifier=os.getenv("NYLAS_GRANT_ID"),
67+
request_body=request_body,
68+
query_params=query_params
69+
)
70+
71+
return event
4772

48-
def get_event_notetaker(event_id):
73+
74+
def get_event_notetaker(event_id: str) -> Optional[Notetaker]:
4975
"""Demonstrates how to retrieve the Notetaker associated with an event."""
5076
print("\n=== Retrieving Event Notetaker ===")
5177

5278
# First get the event to get the Notetaker ID
53-
event = nylas.events.find(event_id)
54-
if not event.notetaker or not event.notetaker.id:
79+
try:
80+
event = nylas.events.find(
81+
identifier=os.getenv("NYLAS_GRANT_ID"),
82+
event_id=event_id,
83+
query_params={"calendar_id": os.getenv("NYLAS_CALENDAR_ID")}
84+
)
85+
except Exception as e:
86+
print(f"Error getting event: {e}")
87+
return None
88+
89+
if not event.data.notetaker or not event.data.notetaker.id:
5590
print(f"No Notetaker found for event {event_id}")
5691
return None
5792

58-
notetaker = nylas.notetakers.find(event.notetaker.id)
93+
notetaker = nylas.notetakers.find(notetaker_id=event.data.notetaker.id, identifier=os.getenv("NYLAS_GRANT_ID"))
5994
print(f"Found Notetaker for event {event_id}:")
60-
print(f"- ID: {notetaker.id}")
61-
print(f"- State: {notetaker.state}")
62-
print(f"- Meeting Provider: {notetaker.meeting_provider}")
95+
print(f"- ID: {notetaker.data.id}")
96+
print(f"- State: {notetaker.data.state}")
97+
print(f"- Meeting Provider: {notetaker.data.meeting_provider}")
98+
print(f"- Meeting Settings:")
99+
print(f" - Video Recording: {notetaker.data.meeting_settings.video_recording}")
100+
print(f" - Audio Recording: {notetaker.data.meeting_settings.audio_recording}")
101+
print(f" - Transcription: {notetaker.data.meeting_settings.transcription}")
63102

64103
return notetaker
65104

66-
def update_event_and_notetaker(event_id, notetaker_id):
105+
def update_event_and_notetaker(event_id: str, notetaker_id: str):
67106
"""Demonstrates how to update both an event and its Notetaker."""
68107
print("\n=== Updating Event and Notetaker ===")
69108

70-
# Update the event
71-
updated_event = nylas.events.update(
72-
event_id,
109+
# Create the notetaker meeting settings
110+
notetaker_settings = EventNotetakerSettings(
111+
video_recording=False,
112+
audio_recording=True,
113+
transcription=False
114+
)
115+
116+
# Create the notetaker request
117+
notetaker = EventNotetakerRequest(
118+
id=notetaker_id,
119+
name="Updated Nylas Notetaker",
120+
meeting_settings=notetaker_settings
121+
)
122+
123+
# Create the update request with proper types
124+
request_body = UpdateEventRequest(
73125
title="Updated Project Planning Meeting",
74126
description="Revised project planning with new timeline",
75-
metadata=EventMetadata(
76-
project_id="PROJ-123",
77-
priority="urgent"
78-
)
127+
metadata={
128+
"project_id": "PROJ-123",
129+
"priority": "urgent"
130+
},
131+
notetaker=notetaker
79132
)
80133

81-
# Update the Notetaker
82-
updated_notetaker = nylas.notetakers.update(
83-
notetaker_id,
84-
name="Updated Project Planning Notetaker",
85-
meeting_settings=NotetakerMeetingSettings(
86-
video_recording=True,
87-
audio_recording=True,
88-
transcription=True
89-
)
134+
# Create the query parameters
135+
query_params = UpdateEventQueryParams(
136+
calendar_id=os.getenv("NYLAS_CALENDAR_ID")
137+
)
138+
139+
updated_event = nylas.events.update(
140+
identifier=os.getenv("NYLAS_GRANT_ID"),
141+
event_id=event_id,
142+
request_body=request_body,
143+
query_params=query_params
90144
)
91145

92-
print(f"Updated event with ID: {updated_event.id}")
93-
print(f"Updated Notetaker with ID: {updated_notetaker.id}")
94-
return updated_event, updated_notetaker
146+
return updated_event
95147

96148
def main():
97149
"""Main function to run all demo examples."""
98150
try:
99151
# Create an event with a Notetaker
100-
event, notetaker = create_event_with_notetaker()
152+
event = create_event_with_notetaker()
153+
if not event:
154+
print("Failed to create event")
155+
return
156+
157+
print(f"Created event with ID: {event.data.id}")
158+
print(f"Event Notetaker ID: {event.data.notetaker.id}")
101159

102160
# Get the Notetaker for the event
103-
get_event_notetaker(event.id)
161+
notetaker = get_event_notetaker(event.data.id)
162+
if not notetaker:
163+
print(f"Failed to get Notetaker for event {event.data.id}")
164+
return
104165

105166
# Update both the event and its Notetaker
106-
updated_event, updated_notetaker = update_event_and_notetaker(event.id, notetaker.id)
167+
updated_event = update_event_and_notetaker(event.data.id, notetaker.data.id)
168+
if not updated_event:
169+
print(f"Failed to update event {event.data.id}")
170+
return
171+
172+
print(f"Updated event with ID: {updated_event.data.id}")
107173

108174
except Exception as e:
109175
print(f"An error occurred: {str(e)}")

nylas/models/events.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,18 @@ class EventNotetakerRequest(TypedDict):
706706
meeting_settings: NotRequired[EventNotetakerSettings]
707707

708708

709+
class CreateEventNotetaker(TypedDict):
710+
"""
711+
Class representing Notetaker settings for an event.
712+
713+
Attributes:
714+
name: The display name for the Notetaker bot.
715+
meeting_settings: Notetaker Meeting Settings.
716+
"""
717+
718+
name: Optional[str] = "Nylas Notetaker"
719+
meeting_settings: Optional[EventNotetakerSettings] = None
720+
709721
class CreateEventRequest(TypedDict):
710722
"""
711723
Interface representing a request to create an event.
@@ -741,7 +753,7 @@ class CreateEventRequest(TypedDict):
741753
visibility: NotRequired[Visibility]
742754
capacity: NotRequired[int]
743755
hide_participants: NotRequired[bool]
744-
notetaker: NotRequired[EventNotetakerRequest]
756+
notetaker: NotRequired[CreateEventNotetaker]
745757

746758

747759
class UpdateEventRequest(TypedDict):

nylas/models/notetakers.py

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,22 @@ class MeetingProvider(str, Enum):
5050
MICROSOFT_TEAMS = "Microsoft Teams"
5151

5252

53+
class NotetakerMeetingSettingsRequest(TypedDict):
54+
"""
55+
Interface representing Notetaker meeting settings for request objects.
56+
57+
Attributes:
58+
video_recording: When true, Notetaker records the meeting's video.
59+
audio_recording: When true, Notetaker records the meeting's audio.
60+
transcription: When true, Notetaker transcribes the meeting's audio.
61+
If transcription is true, audio_recording must also be true.
62+
"""
63+
64+
video_recording: Optional[bool]
65+
audio_recording: Optional[bool]
66+
transcription: Optional[bool]
67+
68+
5369
@dataclass_json
5470
@dataclass
5571
class NotetakerMeetingSettings:
@@ -63,9 +79,9 @@ class NotetakerMeetingSettings:
6379
If transcription is true, audio_recording must also be true.
6480
"""
6581

66-
video_recording: Optional[bool] = True
67-
audio_recording: Optional[bool] = True
68-
transcription: Optional[bool] = True
82+
video_recording: bool = True
83+
audio_recording: bool = True
84+
transcription: bool = True
6985

7086

7187
@dataclass_json
@@ -152,7 +168,7 @@ def has_media_available(self) -> bool:
152168

153169
class InviteNotetakerRequest(TypedDict):
154170
"""
155-
Class representation of the Nylas notetaker creation request.
171+
Interface representing the Nylas notetaker creation request.
156172
157173
Attributes:
158174
meeting_link: A meeting invitation link that Notetaker uses to join the meeting.
@@ -165,12 +181,12 @@ class InviteNotetakerRequest(TypedDict):
165181
meeting_link: str
166182
join_time: NotRequired[int]
167183
name: NotRequired[str]
168-
meeting_settings: NotRequired[dict]
184+
meeting_settings: NotRequired[NotetakerMeetingSettingsRequest]
169185

170186

171187
class UpdateNotetakerRequest(TypedDict):
172188
"""
173-
Class representation of the Nylas notetaker update request.
189+
Interface representing the Nylas notetaker update request.
174190
175191
Attributes:
176192
join_time: When Notetaker should join the meeting, in Unix timestamp format.
@@ -180,7 +196,7 @@ class UpdateNotetakerRequest(TypedDict):
180196

181197
join_time: NotRequired[int]
182198
name: NotRequired[str]
183-
meeting_settings: NotRequired[dict]
199+
meeting_settings: NotRequired[NotetakerMeetingSettingsRequest]
184200

185201

186202
class ListNotetakerQueryParams(ListQueryParams):
@@ -220,3 +236,19 @@ class FindNotetakerQueryParams(TypedDict):
220236
"""
221237

222238
select: NotRequired[str]
239+
240+
241+
@dataclass_json
242+
@dataclass
243+
class NotetakerLeaveResponse:
244+
"""
245+
Class representing a Notetaker leave response.
246+
247+
Attributes:
248+
id: The Notetaker ID.
249+
message: A message describing the API response.
250+
"""
251+
252+
id: str
253+
message: str
254+
object: str = "notetaker_leave_response"

0 commit comments

Comments
 (0)