From 11f4162050c1ce5b9a58f71177c807cc6c63e5fe Mon Sep 17 00:00:00 2001 From: Vladyslav Date: Mon, 1 Sep 2025 22:01:35 +0300 Subject: [PATCH 1/4] fix lang code defaults. --- aiola/clients/stt/client.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/aiola/clients/stt/client.py b/aiola/clients/stt/client.py index a88c978..19acbce 100644 --- a/aiola/clients/stt/client.py +++ b/aiola/clients/stt/client.py @@ -63,13 +63,17 @@ def _build_query_and_headers( query = { "execution_id": execution_id, "flow_id": resolved_workflow_id, - "lang_code": lang_code or "en", "time_zone": time_zone or "UTC", - "keywords": json.dumps(keywords or {}), - "tasks_config": json.dumps(tasks_config or {}), "x-aiola-api-token": access_token, } + if lang_code is not None: + query["lang_code"] = lang_code + if keywords is not None: + query["keywords"] = json.dumps(keywords) + if tasks_config is not None: + query["tasks_config"] = json.dumps(tasks_config) + headers = { "Authorization": f"Bearer {access_token}", } From 7ac3e9cda4415b2c9ea8d4c0ceba43a182bbaebf Mon Sep 17 00:00:00 2001 From: Vladyslav Date: Mon, 1 Sep 2025 22:08:01 +0300 Subject: [PATCH 2/4] Update test to clarify handling of None tasks_config in SttClient.stream --- tests/unit/stt/test_stt_client.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/unit/stt/test_stt_client.py b/tests/unit/stt/test_stt_client.py index 8780cbc..feca5de 100644 --- a/tests/unit/stt/test_stt_client.py +++ b/tests/unit/stt/test_stt_client.py @@ -326,7 +326,7 @@ def test_stt_stream_with_empty_tasks_config(patch_dummy_socket): def test_stt_stream_with_no_tasks_config(patch_dummy_socket): - """``SttClient.stream`` handles None tasks_config properly.""" + """``SttClient.stream`` handles None tasks_config properly by not including it in URL.""" client = AiolaClient(api_key="secret-key", base_url="https://speech.example") @@ -341,15 +341,14 @@ def test_stt_stream_with_no_tasks_config(patch_dummy_socket): # Access the underlying socket to validate connection parameters sio = connection._sio - # Verify None tasks_config is serialized as empty JSON object + # Verify None tasks_config is not included in URL kwargs = sio.connect_kwargs url = kwargs["url"] parsed = urllib.parse.urlparse(url) query = urllib.parse.parse_qs(parsed.query) - tasks_config_json = query["tasks_config"][0] - parsed_tasks_config = json.loads(tasks_config_json) - assert parsed_tasks_config == {} + # tasks_config should not be present when None + assert "tasks_config" not in query def test_stt_stream_with_all_tasks_config(patch_dummy_socket): From 866fd5aac76b7f7b20a1bd45f70bccb798763a32 Mon Sep 17 00:00:00 2001 From: Vladyslav Date: Mon, 1 Sep 2025 22:29:46 +0300 Subject: [PATCH 3/4] add structured event --- aiola/types.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aiola/types.py b/aiola/types.py index 9d8b883..376eb1f 100644 --- a/aiola/types.py +++ b/aiola/types.py @@ -59,6 +59,7 @@ class LiveEvents(str, enum.Enum): Error = "error" Disconnect = "disconnect" Connect = "connect" + Structured = "structured" @dataclass From 3f984162f383d5dc7b2d83e52e21dfd04ed6d920 Mon Sep 17 00:00:00 2001 From: stavelmashally Date: Tue, 2 Sep 2025 11:04:55 +0300 Subject: [PATCH 4/4] Refactor AiolaClientOptions: remove unused event types and consolidate payloads; add StructuredResponse dataclass for structured API responses. --- aiola/types.py | 52 +++++++++----------------------------------------- 1 file changed, 9 insertions(+), 43 deletions(-) diff --git a/aiola/types.py b/aiola/types.py index 376eb1f..0978fc3 100644 --- a/aiola/types.py +++ b/aiola/types.py @@ -3,7 +3,7 @@ import enum from collections.abc import Mapping from dataclasses import dataclass -from typing import IO, Union +from typing import IO, Any, Union from .constants import DEFAULT_AUTH_BASE_URL, DEFAULT_BASE_URL, DEFAULT_HTTP_TIMEOUT, DEFAULT_WORKFLOW_ID @@ -46,20 +46,10 @@ def __post_init__(self) -> None: class LiveEvents(str, enum.Enum): Transcript = "transcript" Translation = "translation" - SentimentAnalysis = "sentiment_analysis" - Summarization = "summarization" - TopicDetection = "topic_detection" - ContentModeration = "content_moderation" - AutoChapters = "auto_chapters" - FormFilling = "form_filling" - EntityDetection = "entity_detection" - EntityDetectionFromList = "entity_detection_from_list" - KeyPhrases = "key_phrases" - PiiRedaction = "pii_redaction" + Structured = "structured" Error = "error" Disconnect = "disconnect" Connect = "connect" - Structured = "structured" @dataclass @@ -116,6 +106,13 @@ def from_dict(cls, data: dict) -> TranscriptionResponse: ) +@dataclass +class StructuredResponse: + """Response from structured API.""" + + results: dict[str, Any] + + @dataclass class SessionCloseResponse: """Response from session close API.""" @@ -138,40 +135,9 @@ class TranslationPayload: dst_lang_code: str -@dataclass -class EntityDetectionFromListPayload: - entity_list: list[str] - - -@dataclass -class _EmptyPayload: - pass - - -EntityDetectionPayload = _EmptyPayload -KeyPhrasesPayload = _EmptyPayload -PiiRedactionPayload = _EmptyPayload -SentimentAnalysisPayload = _EmptyPayload -SummarizationPayload = _EmptyPayload -TopicDetectionPayload = _EmptyPayload -ContentModerationPayload = _EmptyPayload -AutoChaptersPayload = _EmptyPayload -FormFillingPayload = _EmptyPayload - - @dataclass class TasksConfig: - FORM_FILLING: FormFillingPayload | None = None TRANSLATION: TranslationPayload | None = None - ENTITY_DETECTION: EntityDetectionPayload | None = None - ENTITY_DETECTION_FROM_LIST: EntityDetectionFromListPayload | None = None - KEY_PHRASES: KeyPhrasesPayload | None = None - PII_REDACTION: PiiRedactionPayload | None = None - SENTIMENT_ANALYSIS: SentimentAnalysisPayload | None = None - SUMMARIZATION: SummarizationPayload | None = None - TOPIC_DETECTION: TopicDetectionPayload | None = None - CONTENT_MODERATION: ContentModerationPayload | None = None - AUTO_CHAPTERS: AutoChaptersPayload | None = None FileContent = Union[IO[bytes], bytes, str]