# Copyright (c) Microsoft. All rights reserved. from abc import ABC, abstractmethod from collections.abc import AsyncIterable from typing import TYPE_CHECKING, Any from semantic_kernel.utils.feature_stage_decorator import experimental if TYPE_CHECKING: from semantic_kernel.agents.agent import Agent from semantic_kernel.contents.chat_message_content import ChatMessageContent @experimental class AgentChannel(ABC): """Defines the communication protocol for a particular Agent type. An agent provides it own AgentChannel via CreateChannel. """ @abstractmethod async def receive( self, history: list["ChatMessageContent"], ) -> None: """Receive the conversation messages. Used when joining a conversation and also during each agent interaction. Args: history: The history of messages in the conversation. """ ... @abstractmethod def invoke( self, agent: "Agent", **kwargs: Any, ) -> AsyncIterable[tuple[bool, "ChatMessageContent"]]: """Perform a discrete incremental interaction between a single Agent and AgentChat. Args: agent: The agent to interact with. kwargs: The keyword arguments. Returns: An async iterable of a bool, ChatMessageContent. """ ... @abstractmethod def invoke_stream( self, agent: "Agent", messages: "list[ChatMessageContent]", **kwargs: Any, ) -> AsyncIterable["ChatMessageContent"]: """Perform a discrete incremental stream interaction between a single Agent and AgentChat. Args: agent: The agent to interact with. messages: The history of messages in the conversation. kwargs: The keyword arguments. Returns: An async iterable ChatMessageContent. """ ... @abstractmethod def get_history( self, ) -> AsyncIterable["ChatMessageContent"]: """Retrieve the message history specific to this channel. Returns: An async iterable of ChatMessageContent. """ ... @abstractmethod async def reset(self) -> None: """Reset any persistent state associated with the channel.""" ...