aidial_analytics_realtime/dial.py (54 lines of code) (raw):

from logging import Logger from typing import Iterator, List def get_chat_completion_request_contents( logger: Logger, request: dict ) -> List[str]: return list(_chat_completion_request_contents(logger, request)) def get_chat_completion_response_contents( logger: Logger, response: dict ) -> List[str]: return list(_chat_completion_response_contents(logger, response)) def get_embeddings_request_contents(logger: Logger, request: dict) -> List[str]: return list(_embeddings_request_contents(logger, request)) def _chat_completion_request_contents( logger: Logger, request: dict ) -> Iterator[str]: for message in request["messages"]: yield from _chat_completion_message_contents(logger, message) def _chat_completion_response_contents( logger: Logger, response: dict ) -> Iterator[str]: message = response["choices"][0]["message"] yield from _chat_completion_message_contents(logger, message) def _embeddings_request_contents( logger: Logger, request: dict ) -> Iterator[str]: inp = request.get("input") if isinstance(inp, str): yield from _non_empty_string(inp) elif isinstance(inp, list): for i in inp: if isinstance(i, str): yield from _non_empty_string(i) else: logger.warning(f"Unexpected type of embeddings input: {type(inp)}") def _chat_completion_message_contents( logger: Logger, message: dict ) -> Iterator[str]: content = message.get("content") if content is None: return elif isinstance(content, str): yield from _non_empty_string(content) elif isinstance(content, list): for content_part in content: if isinstance(content_part, dict): if content_part.get("type") == "text" and ( text := content_part.get("text") ): yield from _non_empty_string(text) else: logger.warning(f"Unexpected message content type: {type(content)}") def _non_empty_string(value: str) -> Iterator[str]: if non_empty := value.strip(): yield non_empty