Skip to content

Commit 787c592

Browse files
authored
Merge pull request #60 from openai/add-thread-updated-event-alias
ThreadItemUpdated is now an alias for ThreadItemUpdatedEvent
2 parents 02e68c1 + 643a02f commit 787c592

5 files changed

Lines changed: 43 additions & 39 deletions

File tree

chatkit/agents.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
ThreadItemAddedEvent,
6464
ThreadItemDoneEvent,
6565
ThreadItemRemovedEvent,
66-
ThreadItemUpdated,
66+
ThreadItemUpdatedEvent,
6767
ThreadMetadata,
6868
ThreadStreamEvent,
6969
URLSource,
@@ -168,7 +168,7 @@ async def update_workflow_task(self, task: Task, task_index: int) -> None:
168168
# ensure reference is updated in case task is a copy
169169
self.workflow_item.workflow.tasks[task_index] = task
170170
await self.stream(
171-
ThreadItemUpdated(
171+
ThreadItemUpdatedEvent(
172172
item_id=self.workflow_item.id,
173173
update=WorkflowTaskUpdated(
174174
task=task,
@@ -191,7 +191,7 @@ async def add_workflow_task(self, task: Task) -> None:
191191
await self.stream(ThreadItemAddedEvent(item=self.workflow_item))
192192
else:
193193
await self.stream(
194-
ThreadItemUpdated(
194+
ThreadItemUpdatedEvent(
195195
item_id=self.workflow_item.id,
196196
update=WorkflowTaskAdded(
197197
task=task,
@@ -448,23 +448,23 @@ def end_workflow(item: WorkflowItem):
448448
if event.part.type == "reasoning_text":
449449
continue
450450
content = _convert_content(event.part)
451-
yield ThreadItemUpdated(
451+
yield ThreadItemUpdatedEvent(
452452
item_id=event.item_id,
453453
update=AssistantMessageContentPartAdded(
454454
content_index=event.content_index,
455455
content=content,
456456
),
457457
)
458458
elif event.type == "response.output_text.delta":
459-
yield ThreadItemUpdated(
459+
yield ThreadItemUpdatedEvent(
460460
item_id=event.item_id,
461461
update=AssistantMessageContentPartTextDelta(
462462
content_index=event.content_index,
463463
delta=event.delta,
464464
),
465465
)
466466
elif event.type == "response.output_text.done":
467-
yield ThreadItemUpdated(
467+
yield ThreadItemUpdatedEvent(
468468
item_id=event.item_id,
469469
update=AssistantMessageContentPartDone(
470470
content_index=event.content_index,
@@ -485,7 +485,7 @@ def end_workflow(item: WorkflowItem):
485485
item_annotation_count[event.item_id][event.content_index] = (
486486
annotation_index + 1
487487
)
488-
yield ThreadItemUpdated(
488+
yield ThreadItemUpdatedEvent(
489489
item_id=event.item_id,
490490
update=AssistantMessageContentPartAnnotationAdded(
491491
content_index=event.content_index,
@@ -533,7 +533,7 @@ def end_workflow(item: WorkflowItem):
533533
task=ThoughtTask(content=event.delta),
534534
)
535535
ctx.workflow_item.workflow.tasks.append(streaming_thought.task)
536-
yield ThreadItemUpdated(
536+
yield ThreadItemUpdatedEvent(
537537
item_id=ctx.workflow_item.id,
538538
update=WorkflowTaskAdded(
539539
task=streaming_thought.task,
@@ -547,7 +547,7 @@ def end_workflow(item: WorkflowItem):
547547
and event.summary_index == streaming_thought.index
548548
):
549549
streaming_thought.task.content += event.delta
550-
yield ThreadItemUpdated(
550+
yield ThreadItemUpdatedEvent(
551551
item_id=ctx.workflow_item.id,
552552
update=WorkflowTaskUpdated(
553553
task=streaming_thought.task,
@@ -578,7 +578,7 @@ def end_workflow(item: WorkflowItem):
578578
task=task,
579579
task_index=ctx.workflow_item.workflow.tasks.index(task),
580580
)
581-
yield ThreadItemUpdated(
581+
yield ThreadItemUpdatedEvent(
582582
item_id=ctx.workflow_item.id,
583583
update=update,
584584
)

chatkit/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
ThreadItemDoneEvent,
4848
ThreadItemRemovedEvent,
4949
ThreadItemReplacedEvent,
50-
ThreadItemUpdated,
50+
ThreadItemUpdatedEvent,
5151
ThreadMetadata,
5252
ThreadsAddClientToolOutputReq,
5353
ThreadsAddUserMessageReq,
@@ -209,7 +209,7 @@ async def stream_widget(
209209
try:
210210
new_state = await widget.__anext__()
211211
for update in diff_widget(last_state, new_state):
212-
yield ThreadItemUpdated(
212+
yield ThreadItemUpdatedEvent(
213213
item_id=item_id,
214214
update=update,
215215
)

chatkit/types.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,18 @@ class ThreadItemAddedEvent(BaseModel):
284284
item: ThreadItem
285285

286286

287-
class ThreadItemUpdated(BaseModel):
287+
class ThreadItemUpdatedEvent(BaseModel):
288288
"""Event describing an update to an existing thread item."""
289289

290290
type: Literal["thread.item.updated"] = "thread.item.updated"
291291
item_id: str
292292
update: ThreadItemUpdate
293293

294294

295+
# Type alias for backwards compatibility
296+
ThreadItemUpdated = ThreadItemUpdatedEvent
297+
298+
295299
class ThreadItemDoneEvent(BaseModel):
296300
"""Event emitted when a thread item is marked complete."""
297301

tests/test_agents.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
Thread,
8787
ThreadItemAddedEvent,
8888
ThreadItemDoneEvent,
89-
ThreadItemUpdated,
89+
ThreadItemUpdatedEvent,
9090
ThreadStreamEvent,
9191
URLSource,
9292
UserMessageItem,
@@ -231,7 +231,7 @@ async def widget_generator():
231231
assert isinstance(events[0].item, WidgetItem)
232232
assert events[0].item.widget == Card(children=[Text(id="text", value="")])
233233

234-
assert isinstance(events[1], ThreadItemUpdated)
234+
assert isinstance(events[1], ThreadItemUpdatedEvent)
235235
assert events[1].update.type == "widget.streaming_text.value_delta"
236236
assert events[1].update.component_id == "text"
237237
assert events[1].update.delta == "Hello, world"
@@ -271,7 +271,7 @@ async def widget_generator():
271271
assert isinstance(events[0].item, WidgetItem)
272272
assert events[0].item.widget == Card(children=[Text(id="text", value="Hello!")])
273273

274-
assert isinstance(events[1], ThreadItemUpdated)
274+
assert isinstance(events[1], ThreadItemUpdatedEvent)
275275
assert events[1].update.type == "widget.root.updated"
276276
assert events[1].update.widget == Card(
277277
children=[Text(key="other text", value="World!", streaming=False)]
@@ -788,7 +788,7 @@ async def test_stream_agent_response_maps_events():
788788
sequence_number=0,
789789
),
790790
),
791-
ThreadItemUpdated(
791+
ThreadItemUpdatedEvent(
792792
item_id="123",
793793
update=AssistantMessageContentPartTextDelta(
794794
content_index=0,
@@ -812,7 +812,7 @@ async def test_stream_agent_response_maps_events():
812812
sequence_number=1,
813813
),
814814
),
815-
ThreadItemUpdated(
815+
ThreadItemUpdatedEvent(
816816
item_id="123",
817817
update=AssistantMessageContentPartAdded(
818818
content_index=1,
@@ -833,7 +833,7 @@ async def test_stream_agent_response_maps_events():
833833
sequence_number=2,
834834
),
835835
),
836-
ThreadItemUpdated(
836+
ThreadItemUpdatedEvent(
837837
item_id="123",
838838
update=AssistantMessageContentPartDone(
839839
content_index=0,
@@ -862,7 +862,7 @@ async def test_stream_agent_response_maps_events():
862862
sequence_number=3,
863863
),
864864
),
865-
ThreadItemUpdated(
865+
ThreadItemUpdatedEvent(
866866
item_id="123",
867867
update=AssistantMessageContentPartAnnotationAdded(
868868
content_index=0,
@@ -949,7 +949,7 @@ def add_annotation_event(annotation, sequence_number):
949949

950950
events = await all_events(stream_agent_response(context, result))
951951
assert events == [
952-
ThreadItemUpdated(
952+
ThreadItemUpdatedEvent(
953953
item_id=item_id,
954954
update=AssistantMessageContentPartAnnotationAdded(
955955
content_index=0,
@@ -960,7 +960,7 @@ def add_annotation_event(annotation, sequence_number):
960960
),
961961
),
962962
),
963-
ThreadItemUpdated(
963+
ThreadItemUpdatedEvent(
964964
item_id=item_id,
965965
update=AssistantMessageContentPartAnnotationAdded(
966966
content_index=0,
@@ -1297,8 +1297,8 @@ async def test_workflow_streams_first_thought():
12971297
event = await anext(stream)
12981298
assert context.workflow_item is not None
12991299
assert len(context.workflow_item.workflow.tasks) == 1
1300-
assert isinstance(event, ThreadItemUpdated)
1301-
assert event == ThreadItemUpdated(
1300+
assert isinstance(event, ThreadItemUpdatedEvent)
1301+
assert event == ThreadItemUpdatedEvent(
13021302
item_id=context.workflow_item.id,
13031303
update=WorkflowTaskAdded(
13041304
task=ThoughtTask(content="Think"),
@@ -1310,8 +1310,8 @@ async def test_workflow_streams_first_thought():
13101310
event = await anext(stream)
13111311
assert context.workflow_item is not None
13121312
assert len(context.workflow_item.workflow.tasks) == 1
1313-
assert isinstance(event, ThreadItemUpdated)
1314-
assert event == ThreadItemUpdated(
1313+
assert isinstance(event, ThreadItemUpdatedEvent)
1314+
assert event == ThreadItemUpdatedEvent(
13151315
item_id=context.workflow_item.id,
13161316
update=WorkflowTaskUpdated(
13171317
task=ThoughtTask(content="Thinking 1"),
@@ -1323,8 +1323,8 @@ async def test_workflow_streams_first_thought():
13231323
event = await anext(stream)
13241324
assert context.workflow_item is not None
13251325
assert len(context.workflow_item.workflow.tasks) == 1
1326-
assert isinstance(event, ThreadItemUpdated)
1327-
assert event == ThreadItemUpdated(
1326+
assert isinstance(event, ThreadItemUpdatedEvent)
1327+
assert event == ThreadItemUpdatedEvent(
13281328
item_id=context.workflow_item.id,
13291329
update=WorkflowTaskUpdated(
13301330
task=ThoughtTask(content="Thinking 1"),
@@ -1336,8 +1336,8 @@ async def test_workflow_streams_first_thought():
13361336
event = await anext(stream)
13371337
assert context.workflow_item is not None
13381338
assert len(context.workflow_item.workflow.tasks) == 2
1339-
assert isinstance(event, ThreadItemUpdated)
1340-
assert event == ThreadItemUpdated(
1339+
assert isinstance(event, ThreadItemUpdatedEvent)
1340+
assert event == ThreadItemUpdatedEvent(
13411341
item_id=context.workflow_item.id,
13421342
update=WorkflowTaskAdded(
13431343
task=ThoughtTask(content="Thinking 2"),
@@ -1420,8 +1420,8 @@ async def test_workflow_ends_on_message():
14201420
event = await anext(stream)
14211421
assert context.workflow_item is not None
14221422
assert len(context.workflow_item.workflow.tasks) == 1
1423-
assert isinstance(event, ThreadItemUpdated)
1424-
assert event == ThreadItemUpdated(
1423+
assert isinstance(event, ThreadItemUpdatedEvent)
1424+
assert event == ThreadItemUpdatedEvent(
14251425
item_id=context.workflow_item.id,
14261426
update=WorkflowTaskAdded(
14271427
task=ThoughtTask(content="Thinking 1"),

tests/test_chatkit_server.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
ThreadItemDoneEvent,
5050
ThreadItemRemovedEvent,
5151
ThreadItemReplacedEvent,
52-
ThreadItemUpdated,
52+
ThreadItemUpdatedEvent,
5353
ThreadListParams,
5454
ThreadMetadata,
5555
ThreadRetryAfterItemParams,
@@ -756,7 +756,7 @@ async def action(
756756
actions.append((action, sender))
757757
assert sender
758758

759-
yield ThreadItemUpdated(
759+
yield ThreadItemUpdatedEvent(
760760
item_id=sender.id,
761761
update=WidgetRootUpdated(
762762
widget=Card(
@@ -807,7 +807,7 @@ async def action(
807807

808808
assert len(events) == 1
809809
assert events[0].type == "thread.item.updated"
810-
assert isinstance(events[0], ThreadItemUpdated)
810+
assert isinstance(events[0], ThreadItemUpdatedEvent)
811811
assert events[0].update.type == "widget.root.updated"
812812
assert events[0].update.widget == Card(children=[Text(value="Email sent!")])
813813

@@ -1090,17 +1090,17 @@ async def widget_generator():
10901090
assert isinstance(events[0].item, WidgetItem)
10911091
assert events[0].item.widget == Card(children=[Text(id="text", value="")])
10921092

1093-
assert isinstance(events[1], ThreadItemUpdated)
1093+
assert isinstance(events[1], ThreadItemUpdatedEvent)
10941094
assert events[1].update.type == "widget.streaming_text.value_delta"
10951095
assert events[1].update.component_id == "text"
10961096
assert events[1].update.delta == "Hel"
10971097

1098-
assert isinstance(events[2], ThreadItemUpdated)
1098+
assert isinstance(events[2], ThreadItemUpdatedEvent)
10991099
assert events[2].update.type == "widget.streaming_text.value_delta"
11001100
assert events[2].update.component_id == "text"
11011101
assert events[2].update.delta == "lo,"
11021102

1103-
assert isinstance(events[3], ThreadItemUpdated)
1103+
assert isinstance(events[3], ThreadItemUpdatedEvent)
11041104
assert events[3].update.type == "widget.streaming_text.value_delta"
11051105
assert events[3].update.component_id == "text"
11061106
assert events[3].update.delta == " world"
@@ -1128,7 +1128,7 @@ async def widget_generator():
11281128
assert isinstance(events[0].item, WidgetItem)
11291129
assert events[0].item.widget == Card(children=[Text(id="text", value="Hello")])
11301130

1131-
assert isinstance(events[1], ThreadItemUpdated)
1131+
assert isinstance(events[1], ThreadItemUpdatedEvent)
11321132
assert events[1].update.type == "widget.root.updated"
11331133
assert events[1].update.widget == Card(children=[Text(id="text", value="World")])
11341134

0 commit comments

Comments
 (0)