Azure / Azure/azure-sdk-for-python
Azure AI Agents EventHandler | Duplicated events emitted
- Dominant language
- Python
- Stars
- 5.6k
- Forks
- 3.4k
- Avg merge
- 1d 21h
- Merged PRs (30d)
- 193
Description
- **Package Name**: azure-ai-agents
- **Package Version**: 1.1.0b1
- **Operating System**: Windows 11
- **Python Version**: 3.13.2
**Describe the bug**
Some of the methods below are duplicated or even tripling when fired. Usually on created events, not on done events (although unlike OpenAI Assistants API there are not seperate events for created/deleted)
`on_thread_run()`
`on_run_step()`
`on_thread_message()`

**To Reproduce**
Steps to reproduce the behavior:
1. Run the sample from https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/ai/azure-ai-agents/samples/agents_async/sample_agents_stream_eventhandler_async.py
```py
import json
from typing import Generator, Optional
import utils.credentials as creds
from azure.ai.agents.models import MessageDeltaChunk, RunStepDeltaChunk
from azure.ai.agents.models import AsyncAgentEventHandler
from azure.identity.aio import DefaultAzureCredential
from azure.ai.agents.aio import AgentsClient
import os
class MyEventHandler(AsyncAgentEventHandler[str]):
async def on_message_delta(self, delta: "MessageDeltaChunk"):
print(f"On Message Delta: {delta}")
async def on_thread_message(self, message: "ThreadMessage"):
print(f"On Thread Message: {message}")
async def on_thread_run(self, run: "ThreadRun"):
print(f"On Thread Run: {run}")
async def on_run_step(self, step: "RunStep"):
print(f"On Run Step: {step}")
async def on_run_step_delta(self, delta: RunStepDeltaChunk):
print(f"On Run Step Delta: {delta}, Type: {type(delta)}")
async def on_error(self, data: str):
print(f"On Error: {data}")
async def on_done(self):
print("On Done")
async def on_unhandled_event(self, event_type: str, event_data: str):
print(f"On Unhandled Event Type: {event_type}, Data: {event_data}")
async with DefaultAzureCredential() as azure_cred:
async with AgentsClient(endpoint=creds.FOUNDRY_PROJECT_ENDPOINT, credential=azure_cred) as agents_client:
agent = await agents_client.get_agent('asst_aEDDmvKSNcrdlX667sCQujt6')
thread = await agents_client.threads.create()
message = await agents_client.messages.create(thread_id=thread.id, role="user", content="tell me a funny joke")
async with await agents_client.runs.stream(
thread_id=thread.id, agent_id=agent.id, event_handler=MyEventHandler()
) as stream:
await stream.until_done()
```
Output:
```bash
On Thread Run: {'id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'object': 'thread.run', 'created_at': 1748987176, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'status': 'queued', 'expires_at': 1748987776, 'model': 'gpt-4.1', 'instructions': 'You are a helpful assistant'}
On Thread Run: {'id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'object': 'thread.run', 'created_at': 1748987176, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'status': 'queued', 'expires_at': 1748987776, 'model': 'gpt-4.1', 'instructions': 'You are a helpful assistant'}
On Thread Run: {'id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'object': 'thread.run', 'created_at': 1748987176, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'status': 'in_progress', 'started_at': 1748987176, 'expires_at': 1748987776, 'model': 'gpt-4.1', 'instructions': 'You are a helpful assistant'}
On Run Step: {'id': 'step_Fc1I5rJdlDQ2nlUf0zudfDGr', 'object': 'thread.run.step', 'created_at': 1748987177, 'run_id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'type': 'message_creation', 'status': 'in_progress', 'step_details': {'type': 'message_creation', 'message_creation': {'message_id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN'}}, 'expired_at': 1748987776, 'assistant_id': 'asst_aEDDmvKSNcrdlX667sCQujt6'}
On Run Step: {'id': 'step_Fc1I5rJdlDQ2nlUf0zudfDGr', 'object': 'thread.run.step', 'created_at': 1748987177, 'run_id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'type': 'message_creation', 'status': 'in_progress', 'step_details': {'type': 'message_creation', 'message_creation': {'message_id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN'}}, 'expired_at': 1748987776, 'assistant_id': 'asst_aEDDmvKSNcrdlX667sCQujt6'}
On Thread Message: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message', 'created_at': 1748987177, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'run_id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'status': 'in_progress', 'role': 'assistant', 'content': [], 'attachments': [], 'metadata': {}, 'assistant_id': 'asst_aEDDmvKSNcrdlX667sCQujt6'}
On Thread Message: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message', 'created_at': 1748987177, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'run_id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'status': 'in_progress', 'role': 'assistant', 'content': [], 'attachments': [], 'metadata': {}, 'assistant_id': 'asst_aEDDmvKSNcrdlX667sCQujt6'}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'Sure', 'annotations': []}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' thing'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '!'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' Here'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '’s'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' a'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' beer'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '-themed'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' joke'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' for'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' you'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ':\n\n'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'Why'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' did'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' the'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' beer'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' go'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' to'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' school'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '?\n\n'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'Because'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' it'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' wanted'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' to'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' be'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' a'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' little'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' b'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'rr'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'r'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '-'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'ighter'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '!'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' 🍺'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '😄'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '\n\n'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': 'Let'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' me'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' know'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' if'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' you'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' want'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' another'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ','}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' or'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' if'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' there'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '’s'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' anything'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' else'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' I'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' can'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' help'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': ' with'}}]}}
On Message Delta: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message.delta', 'delta': {'content': [{'index': 0, 'type': 'text', 'text': {'value': '!'}}]}}
On Thread Message: {'id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN', 'object': 'thread.message', 'created_at': 1748987177, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'run_id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'status': 'completed', 'completed_at': 1748987178, 'role': 'assistant', 'content': [{'type': 'text', 'text': {'value': 'Sure thing! Here’s a beer-themed joke for you:\n\nWhy did the beer go to school?\n\nBecause it wanted to be a little brrr-ighter! 🍺😄\n\nLet me know if you want another, or if there’s anything else I can help with!', 'annotations': []}}], 'attachments': [], 'metadata': {}, 'assistant_id': 'asst_aEDDmvKSNcrdlX667sCQujt6'}
On Run Step: {'id': 'step_Fc1I5rJdlDQ2nlUf0zudfDGr', 'object': 'thread.run.step', 'created_at': 1748987177, 'run_id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'type': 'message_creation', 'status': 'completed', 'completed_at': 1748987178, 'step_details': {'type': 'message_creation', 'message_creation': {'message_id': 'msg_bomUfFEASYAzBp4Xx5dIxyyN'}}, 'usage': {'prompt_tokens': 9271, 'completion_tokens': 59, 'total_tokens': 9330, 'prompt_token_details': {'cached_tokens': 0}}, 'expired_at': 1748987776, 'assistant_id': 'asst_aEDDmvKSNcrdlX667sCQujt6'}
On Thread Run: {'id': 'run_RP9SjGdOz6zz6f4qPiMKeiju', 'object': 'thread.run', 'created_at': 1748987176, 'thread_id': 'thread_f6RjyphlUhnDPQn0RGdmRmsJ', 'status': 'completed', 'started_at': 1748987176, 'completed_at': 1748987178, 'model': 'gpt-4.1', 'instructions': 'You are a helpful assistant'}
On Done
```
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.
Contributor guide
Assessment
This issue has not been assessed yet.