Azure / Azure/azure-sdk-for-python

Azure AI Agents EventHandler | Duplicated events emitted

Open
#41,418 2 comments 0 reactions 1 assignee Claimed by @howieleung View on GitHub
AI Agents bug customer-reported needs-team-attention
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()`
![Image](https://github.com/user-attachments/assets/9d353125-d913-4ee8-80aa-ee5975c40f1d)

**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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.