# Copyright (c) Microsoft. All rights reserved. from collections.abc import AsyncIterable, Sequence from typing import Any, Generic, Protocol, TypeVar, runtime_checkable from ._types import ChatMessage, ChatResponse, ChatResponseUpdate, GeneratedEmbeddings TInput = TypeVar("TInput", contravariant=True) TEmbedding = TypeVar("TEmbedding") # region: ChatClient Protocol @runtime_checkable class ChatClient(Protocol): """A protocol for a chat client that can generate responses.""" async def get_response( self, messages: ChatMessage | Sequence[ChatMessage], **kwargs: Any, ) -> ChatResponse: """Sends input and returns the response. Args: messages: The sequence of input messages to send. **kwargs: Additional options for the request, such as ai_model_id, temperature, etc. See `ChatOptions` for more details. Returns: The response messages generated by the client. Raises: ValueError: If the input message sequence is `None`. """ ... async def get_streaming_response( self, messages: ChatMessage | Sequence[ChatMessage], **kwargs: Any, ) -> AsyncIterable[ChatResponseUpdate]: """Sends input messages and streams the response. Args: messages: The sequence of input messages to send. **kwargs: Additional options for the request, such as ai_model_id, temperature, etc. See `ChatOptions` for more details. Yields: An async iterable of chat response updates containing the content of the response messages generated by the client. Raises: ValueError: If the input message sequence is `None`. """ ... # region: Embedding Client @runtime_checkable class EmbeddingGenerator(Protocol, Generic[TInput, TEmbedding]): """A protocol for an embedding generator that can create embeddings from input data.""" async def generate( self, input_data: Sequence[TInput], **kwargs: Any, ) -> GeneratedEmbeddings[TEmbedding]: """Generates an embedding for the given input data. Args: input_data: The input data to generate an embedding for. **kwargs: Additional options for the request. Returns: The generated embedding, this acts like a list, but has additional metadata and usage details. """ ...