Skip to content

Commit 723b9d2

Browse files
stephentoubCopilot
andcommitted
Clarify typed Python event examples
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent a5e3ec9 commit 723b9d2

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

python/README.md

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ python chat.py
2525

2626
```python
2727
import asyncio
28+
from typing import cast
29+
2830
from copilot import CopilotClient
29-
from copilot.session import PermissionHandler
31+
from copilot.generated.session_events import AssistantMessageData
3032

3133
async def main():
3234
# Client automatically starts on enter and cleans up on exit
@@ -38,7 +40,7 @@ async def main():
3840

3941
def on_event(event):
4042
if event.type.value == "assistant.message":
41-
print(event.data.content)
43+
print(cast(AssistantMessageData, event.data).content)
4244
elif event.type.value == "session.idle":
4345
done.set()
4446

@@ -57,7 +59,10 @@ If you need more control over the lifecycle, you can call `start()`, `stop()`, a
5759

5860
```python
5961
import asyncio
62+
from typing import cast
63+
6064
from copilot import CopilotClient
65+
from copilot.generated.session_events import AssistantMessageData
6166
from copilot.session import PermissionHandler
6267

6368
async def main():
@@ -74,7 +79,7 @@ async def main():
7479

7580
def on_event(event):
7681
if event.type.value == "assistant.message":
77-
print(event.data.content)
82+
print(cast(AssistantMessageData, event.data).content)
7883
elif event.type.value == "session.idle":
7984
done.set()
8085

@@ -333,7 +338,15 @@ Enable streaming to receive assistant response chunks as they're generated:
333338

334339
```python
335340
import asyncio
341+
from typing import cast
342+
336343
from copilot import CopilotClient
344+
from copilot.generated.session_events import (
345+
AssistantMessageData,
346+
AssistantMessageDeltaData,
347+
AssistantReasoningData,
348+
AssistantReasoningDeltaData,
349+
)
337350
from copilot.session import PermissionHandler
338351

339352
async def main():
@@ -350,20 +363,20 @@ async def main():
350363
match event.type.value:
351364
case "assistant.message_delta":
352365
# Streaming message chunk - print incrementally
353-
delta = event.data.delta_content or ""
366+
delta = cast(AssistantMessageDeltaData, event.data).delta_content or ""
354367
print(delta, end="", flush=True)
355368
case "assistant.reasoning_delta":
356369
# Streaming reasoning chunk (if model supports reasoning)
357-
delta = event.data.delta_content or ""
370+
delta = cast(AssistantReasoningDeltaData, event.data).delta_content or ""
358371
print(delta, end="", flush=True)
359372
case "assistant.message":
360373
# Final message - complete content
361374
print("\n--- Final message ---")
362-
print(event.data.content)
375+
print(cast(AssistantMessageData, event.data).content)
363376
case "assistant.reasoning":
364377
# Final reasoning content (if model supports reasoning)
365378
print("--- Reasoning ---")
366-
print(event.data.content)
379+
print(cast(AssistantReasoningData, event.data).content)
367380
case "session.idle":
368381
# Session finished processing
369382
done.set()

python/copilot/session.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,9 +1128,11 @@ async def send_and_wait(
11281128
Exception: If the session has been disconnected or the connection fails.
11291129
11301130
Example:
1131+
>>> from typing import cast
1132+
>>> from copilot.generated.session_events import AssistantMessageData
11311133
>>> response = await session.send_and_wait("What is 2+2?")
11321134
>>> if response:
1133-
... print(response.data.content)
1135+
... print(cast(AssistantMessageData, response.data).content)
11341136
"""
11351137
idle_event = asyncio.Event()
11361138
error_event: Exception | None = None
@@ -1176,11 +1178,13 @@ def on(self, handler: Callable[[SessionEvent], None]) -> Callable[[], None]:
11761178
A function that, when called, unsubscribes the handler.
11771179
11781180
Example:
1181+
>>> from typing import cast
1182+
>>> from copilot.generated.session_events import AssistantMessageData, SessionErrorData
11791183
>>> def handle_event(event):
1180-
... if event.type == "assistant.message":
1181-
... print(f"Assistant: {event.data.content}")
1182-
... elif event.type == "session.error":
1183-
... print(f"Error: {event.data.message}")
1184+
... if event.type.value == "assistant.message":
1185+
... print(f"Assistant: {cast(AssistantMessageData, event.data).content}")
1186+
... elif event.type.value == "session.error":
1187+
... print(f"Error: {cast(SessionErrorData, event.data).message}")
11841188
>>> unsubscribe = session.on(handle_event)
11851189
>>> # Later, to stop receiving events:
11861190
>>> unsubscribe()
@@ -1801,10 +1805,12 @@ async def get_messages(self) -> list[SessionEvent]:
18011805
Exception: If the session has been disconnected or the connection fails.
18021806
18031807
Example:
1808+
>>> from typing import cast
1809+
>>> from copilot.generated.session_events import AssistantMessageData
18041810
>>> events = await session.get_messages()
18051811
>>> for event in events:
1806-
... if event.type == "assistant.message":
1807-
... print(f"Assistant: {event.data.content}")
1812+
... if event.type.value == "assistant.message":
1813+
... print(f"Assistant: {cast(AssistantMessageData, event.data).content}")
18081814
"""
18091815
response = await self._client.request("session.getMessages", {"sessionId": self.session_id})
18101816
# Convert dict events to SessionEvent objects

0 commit comments

Comments
 (0)