Skip to content

Commit 28011f5

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

File tree

4 files changed

+143
-64
lines changed

4 files changed

+143
-64
lines changed

examples/notetaker_api_demo/notetaker_demo.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import sys
33
import json
4+
from datetime import datetime, timedelta
45
from nylas import Client
56
from nylas.models.notetakers import NotetakerMeetingSettings, NotetakerState, InviteNotetakerRequest
67
from nylas.models.errors import NylasApiError
@@ -23,11 +24,11 @@ def invite_notetaker():
2324
request_body: InviteNotetakerRequest = {
2425
"meeting_link": meeting_link,
2526
"name": "Nylas Notetaker",
26-
"meeting_settings": {
27-
"video_recording": True,
28-
"audio_recording": True,
29-
"transcription": True
30-
}
27+
"meeting_settings": NotetakerMeetingSettings(
28+
video_recording=True,
29+
audio_recording=True,
30+
transcription=True
31+
)
3132
}
3233

3334
print(f"Request body: {json.dumps(request_body, indent=2)}")

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):

tests/resources/test_notetakers.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_list_notetakers_without_identifier(self, http_client_list_response):
8888
notetakers.list(query_params=None)
8989

9090
http_client_list_response._execute.assert_called_once_with(
91-
"GET", "/v3/grants/notetakers", None, None, None, overrides=None
91+
"GET", "/v3/notetakers", None, None, None, overrides=None
9292
)
9393

9494
def test_list_notetakers_with_query_params(self, http_client_list_response):
@@ -157,7 +157,7 @@ def test_find_notetaker_without_identifier(self, http_client_response):
157157

158158
http_client_response._execute.assert_called_once_with(
159159
"GET",
160-
"/v3/grants/notetakers/notetaker-123",
160+
"/v3/notetakers/notetaker-123",
161161
None,
162162
None,
163163
None,
@@ -205,7 +205,7 @@ def test_invite_notetaker_without_identifier(self, http_client_response):
205205

206206
http_client_response._execute.assert_called_once_with(
207207
"POST",
208-
"/v3/grants/notetakers",
208+
"/v3/notetakers",
209209
None,
210210
None,
211211
request_body,
@@ -253,7 +253,7 @@ def test_update_notetaker_without_identifier(self, http_client_response):
253253

254254
http_client_response._execute.assert_called_once_with(
255255
"PATCH",
256-
"/v3/grants/notetakers/notetaker-123",
256+
"/v3/notetakers/notetaker-123",
257257
None,
258258
None,
259259
request_body,
@@ -286,7 +286,7 @@ def test_leave_meeting_without_identifier(self, http_client_response):
286286

287287
http_client_response._execute.assert_called_once_with(
288288
"POST",
289-
"/v3/grants/notetakers/notetaker-123/leave",
289+
"/v3/notetakers/notetaker-123/leave",
290290
None,
291291
None,
292292
None,
@@ -319,7 +319,7 @@ def test_get_media_without_identifier(self, http_client_response):
319319

320320
http_client_response._execute.assert_called_once_with(
321321
"GET",
322-
"/v3/grants/notetakers/notetaker-123/media",
322+
"/v3/notetakers/notetaker-123/media",
323323
None,
324324
None,
325325
None,
@@ -352,7 +352,7 @@ def test_cancel_notetaker_without_identifier(self, http_client_delete_response):
352352

353353
http_client_delete_response._execute.assert_called_once_with(
354354
"DELETE",
355-
"/v3/grants/notetakers/notetaker-123/cancel",
355+
"/v3/notetakers/notetaker-123/cancel",
356356
None,
357357
None,
358358
None,

0 commit comments

Comments
 (0)