Skip to content

Commit 2130bcb

Browse files
author
zhansheng.lzs
committed
refactor: clean up explicit-parameters refactor
- Remove dead code _get_protocol_params and its unused import; UA-merge logic now exists in a single place (_build_api_request) - Extract _merge_recognition_params helper to deduplicate repeated recognition-parameter merge blocks in Recognition (3 sites) and TranslationRecognizerRealtime/Chat (5 sites) - Use Optional[...] annotations for explicit parameters introduced by the refactor (factory, Application.call, recognition, translation_recognizer, tokenization) Behavior unchanged; all 460 unit tests pass.
1 parent 7e9a688 commit 2130bcb

5 files changed

Lines changed: 181 additions & 274 deletions

File tree

dashscope/api_entities/api_request_factory.py

Lines changed: 10 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
# Copyright (c) Alibaba, Inc. and its affiliates.
3-
from typing import Any, Dict, Union
3+
from typing import Any, Dict, Optional, Union
44
from urllib.parse import urlencode
55

66
import aiohttp
@@ -12,7 +12,6 @@
1212
from dashscope.api_entities.http_request import HttpRequest
1313
from dashscope.api_entities.websocket_request import WebSocketRequest
1414
from dashscope.common.constants import (
15-
REQUEST_TIMEOUT_KEYWORD,
1615
SERVICE_API_PATH,
1716
ApiProtocol,
1817
HTTPMethod,
@@ -22,57 +21,6 @@
2221
from dashscope.protocol.websocket import WebsocketStreamingMode
2322

2423

25-
def _get_protocol_params(kwargs):
26-
api_protocol = kwargs.pop("api_protocol", ApiProtocol.HTTPS)
27-
ws_stream_mode = kwargs.pop("ws_stream_mode", WebsocketStreamingMode.OUT)
28-
is_binary_input = kwargs.pop("is_binary_input", False)
29-
http_method = kwargs.pop("http_method", HTTPMethod.POST)
30-
stream = kwargs.get("stream", False)
31-
if not stream and ws_stream_mode == WebsocketStreamingMode.OUT:
32-
ws_stream_mode = WebsocketStreamingMode.NONE
33-
34-
async_request = kwargs.pop("async_request", False)
35-
query = kwargs.pop("query", False)
36-
headers = kwargs.pop("headers", None)
37-
request_timeout = kwargs.pop(REQUEST_TIMEOUT_KEYWORD, None)
38-
form = kwargs.pop("form", None)
39-
resources = kwargs.pop("resources", None)
40-
base_address = kwargs.pop("base_address", None)
41-
flattened_output = kwargs.pop("flattened_output", False)
42-
extra_url_parameters = kwargs.pop("extra_url_parameters", None)
43-
session = kwargs.pop("session", None)
44-
45-
# Extract user_agent from kwargs (preferred) or from headers["user-agent"]
46-
user_agent = kwargs.pop("user_agent", "")
47-
if headers and "user-agent" in headers:
48-
header_ua = headers.pop("user-agent")
49-
if user_agent:
50-
user_agent = (
51-
f"{header_ua}; {user_agent}" if header_ua else user_agent
52-
)
53-
else:
54-
user_agent = header_ua
55-
56-
return (
57-
api_protocol,
58-
ws_stream_mode,
59-
is_binary_input,
60-
http_method,
61-
stream,
62-
async_request,
63-
query,
64-
headers,
65-
request_timeout,
66-
form,
67-
resources,
68-
base_address,
69-
flattened_output,
70-
extra_url_parameters,
71-
user_agent,
72-
session,
73-
)
74-
75-
7624
def _build_api_request( # pylint: disable=too-many-branches
7725
# pylint: disable=too-many-arguments,too-many-locals
7826
model: str,
@@ -87,23 +35,23 @@ def _build_api_request( # pylint: disable=too-many-branches
8735
http_method: HTTPMethod = HTTPMethod.POST,
8836
stream: bool = False,
8937
async_request: bool = False,
90-
request_timeout: int = None,
38+
request_timeout: Optional[int] = None,
9139
# WebSocket specific
9240
ws_stream_mode: WebsocketStreamingMode = WebsocketStreamingMode.OUT,
9341
is_binary_input: bool = False,
9442
# HTTP specific
9543
query: bool = False,
96-
headers: Dict[str, str] = None,
97-
form: Dict = None,
98-
resources: Dict = None,
99-
base_address: str = None,
44+
headers: Optional[Dict[str, str]] = None,
45+
form: Optional[Dict] = None,
46+
resources: Optional[Dict] = None,
47+
base_address: Optional[str] = None,
10048
flattened_output: bool = False,
101-
extra_url_parameters: Dict[str, Any] = None,
49+
extra_url_parameters: Optional[Dict[str, Any]] = None,
10250
user_agent: str = "",
103-
session: Union[requests.Session, aiohttp.ClientSession] = None,
104-
task_id: str = None,
51+
session: Optional[Union[requests.Session, aiohttp.ClientSession]] = None,
52+
task_id: Optional[str] = None,
10553
enable_encryption: bool = False,
106-
pre_task_id: str = None,
54+
pre_task_id: Optional[str] = None,
10755
# Additional parameters for API request data
10856
**kwargs,
10957
):

dashscope/app/application.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
@Desc : Application calls for both http and http sse
77
"""
88
import copy
9-
from typing import Any, Dict, Generator, List, Union
9+
from typing import Any, Dict, Generator, List, Optional, Union
1010

1111
from dashscope.api_entities.api_request_factory import _build_api_request
1212
from dashscope.api_entities.dashscope_response import Message, Role
@@ -63,21 +63,21 @@ def call( # type: ignore[override]
6363
workspace: str = None,
6464
api_key: str = None,
6565
messages: List[Message] = None,
66-
stream: bool = None,
67-
temperature: float = None,
68-
top_p: float = None,
69-
top_k: int = None,
70-
seed: int = None,
71-
session_id: str = None,
72-
biz_params: Dict[str, Any] = None,
73-
has_thoughts: bool = None,
74-
doc_tag_codes: List[str] = None,
75-
doc_reference_type: str = None,
76-
memory_id: str = None,
77-
image_list: List[str] = None,
78-
file_list: List[str] = None,
79-
rag_options: Dict[str, Any] = None,
80-
incremental_output: bool = None,
66+
stream: Optional[bool] = None,
67+
temperature: Optional[float] = None,
68+
top_p: Optional[float] = None,
69+
top_k: Optional[int] = None,
70+
seed: Optional[int] = None,
71+
session_id: Optional[str] = None,
72+
biz_params: Optional[Dict[str, Any]] = None,
73+
has_thoughts: Optional[bool] = None,
74+
doc_tag_codes: Optional[List[str]] = None,
75+
doc_reference_type: Optional[str] = None,
76+
memory_id: Optional[str] = None,
77+
image_list: Optional[List[str]] = None,
78+
file_list: Optional[List[str]] = None,
79+
rag_options: Optional[Dict[str, Any]] = None,
80+
incremental_output: Optional[bool] = None,
8181
**kwargs,
8282
) -> Union[
8383
ApplicationResponse,

dashscope/audio/asr/recognition.py

Lines changed: 76 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from http import HTTPStatus
1111
from queue import Queue
1212
from threading import Timer
13-
from typing import Any, Dict, List, Union
13+
from typing import Any, Dict, List, Optional, Union
1414

1515
from dashscope.api_entities.dashscope_response import RecognitionResponse
1616
from dashscope.client.base_api import BaseApi
@@ -27,6 +27,36 @@
2727
from dashscope.protocol.websocket import WebsocketStreamingMode
2828

2929

30+
def _merge_recognition_params(
31+
kwargs: Dict[str, Any],
32+
disfluency_removal_enabled: Optional[bool],
33+
diarization_enabled: Optional[bool],
34+
speaker_count: Optional[int],
35+
timestamp_alignment_enabled: Optional[bool],
36+
special_word_filter: Optional[str],
37+
audio_event_detection_enabled: Optional[bool],
38+
) -> Dict[str, Any]:
39+
"""Merge explicit recognition parameters into ``kwargs`` in place.
40+
41+
Only parameters that are not None are written, so callers can pass
42+
through values that the user did not set.
43+
44+
Returns:
45+
The merged ``kwargs`` dict (the same object).
46+
"""
47+
for key, value in (
48+
("disfluency_removal_enabled", disfluency_removal_enabled),
49+
("diarization_enabled", diarization_enabled),
50+
("speaker_count", speaker_count),
51+
("timestamp_alignment_enabled", timestamp_alignment_enabled),
52+
("special_word_filter", special_word_filter),
53+
("audio_event_detection_enabled", audio_event_detection_enabled),
54+
):
55+
if value is not None:
56+
kwargs[key] = value
57+
return kwargs
58+
59+
3060
class RecognitionResult(RecognitionResponse):
3161
"""The result set of speech recognition, including the single-sentence
3262
recognition result returned by the callback mode, and all recognition
@@ -166,12 +196,12 @@ def __init__(
166196
sample_rate: int,
167197
workspace: str = None,
168198
# Recognition parameters
169-
disfluency_removal_enabled: bool = None,
170-
diarization_enabled: bool = None,
171-
speaker_count: int = None,
172-
timestamp_alignment_enabled: bool = None,
173-
special_word_filter: str = None,
174-
audio_event_detection_enabled: bool = None,
199+
disfluency_removal_enabled: Optional[bool] = None,
200+
diarization_enabled: Optional[bool] = None,
201+
speaker_count: Optional[int] = None,
202+
timestamp_alignment_enabled: Optional[bool] = None,
203+
special_word_filter: Optional[str] = None,
204+
audio_event_detection_enabled: Optional[bool] = None,
175205
**kwargs,
176206
):
177207
if model is None:
@@ -193,24 +223,15 @@ def __init__(
193223
self._silence_timer = None
194224
self._kwargs = kwargs
195225
# Store recognition parameters
196-
if disfluency_removal_enabled is not None:
197-
self._kwargs[
198-
"disfluency_removal_enabled"
199-
] = disfluency_removal_enabled
200-
if diarization_enabled is not None:
201-
self._kwargs["diarization_enabled"] = diarization_enabled
202-
if speaker_count is not None:
203-
self._kwargs["speaker_count"] = speaker_count
204-
if timestamp_alignment_enabled is not None:
205-
self._kwargs[
206-
"timestamp_alignment_enabled"
207-
] = timestamp_alignment_enabled
208-
if special_word_filter is not None:
209-
self._kwargs["special_word_filter"] = special_word_filter
210-
if audio_event_detection_enabled is not None:
211-
self._kwargs[
212-
"audio_event_detection_enabled"
213-
] = audio_event_detection_enabled
226+
_merge_recognition_params(
227+
self._kwargs,
228+
disfluency_removal_enabled,
229+
diarization_enabled,
230+
speaker_count,
231+
timestamp_alignment_enabled,
232+
special_word_filter,
233+
audio_event_detection_enabled,
234+
)
214235
self._workspace = workspace
215236
self._start_stream_timestamp = -1
216237
self._first_package_timestamp = -1
@@ -348,12 +369,12 @@ def start(
348369
self,
349370
phrase_id: str = None,
350371
# Recognition parameters
351-
disfluency_removal_enabled: bool = None,
352-
diarization_enabled: bool = None,
353-
speaker_count: int = None,
354-
timestamp_alignment_enabled: bool = None,
355-
special_word_filter: str = None,
356-
audio_event_detection_enabled: bool = None,
372+
disfluency_removal_enabled: Optional[bool] = None,
373+
diarization_enabled: Optional[bool] = None,
374+
speaker_count: Optional[int] = None,
375+
timestamp_alignment_enabled: Optional[bool] = None,
376+
special_word_filter: Optional[str] = None,
377+
audio_event_detection_enabled: Optional[bool] = None,
357378
**kwargs,
358379
):
359380
"""Real-time speech recognition in asynchronous mode.
@@ -392,24 +413,15 @@ def start(
392413
self._on_complete_timestamp = -1
393414
self._phrase = phrase_id
394415
# Update recognition parameters
395-
if disfluency_removal_enabled is not None:
396-
self._kwargs[
397-
"disfluency_removal_enabled"
398-
] = disfluency_removal_enabled
399-
if diarization_enabled is not None:
400-
self._kwargs["diarization_enabled"] = diarization_enabled
401-
if speaker_count is not None:
402-
self._kwargs["speaker_count"] = speaker_count
403-
if timestamp_alignment_enabled is not None:
404-
self._kwargs[
405-
"timestamp_alignment_enabled"
406-
] = timestamp_alignment_enabled
407-
if special_word_filter is not None:
408-
self._kwargs["special_word_filter"] = special_word_filter
409-
if audio_event_detection_enabled is not None:
410-
self._kwargs[
411-
"audio_event_detection_enabled"
412-
] = audio_event_detection_enabled
416+
_merge_recognition_params(
417+
self._kwargs,
418+
disfluency_removal_enabled,
419+
diarization_enabled,
420+
speaker_count,
421+
timestamp_alignment_enabled,
422+
special_word_filter,
423+
audio_event_detection_enabled,
424+
)
413425
self._kwargs.update(**kwargs)
414426
self._recognition_once = False
415427
self._worker = threading.Thread(target=self.__receive_worker)
@@ -434,12 +446,12 @@ def call( # type: ignore[override] # noqa: E501
434446
file: str,
435447
phrase_id: str = None,
436448
# Recognition parameters
437-
disfluency_removal_enabled: bool = None,
438-
diarization_enabled: bool = None,
439-
speaker_count: int = None,
440-
timestamp_alignment_enabled: bool = None,
441-
special_word_filter: str = None,
442-
audio_event_detection_enabled: bool = None,
449+
disfluency_removal_enabled: Optional[bool] = None,
450+
diarization_enabled: Optional[bool] = None,
451+
speaker_count: Optional[int] = None,
452+
timestamp_alignment_enabled: Optional[bool] = None,
453+
special_word_filter: Optional[str] = None,
454+
audio_event_detection_enabled: Optional[bool] = None,
443455
**kwargs,
444456
) -> RecognitionResult:
445457
"""Real-time speech recognition in synchronous mode.
@@ -482,24 +494,15 @@ def call( # type: ignore[override] # noqa: E501
482494
self._stream_data = Queue()
483495
self._phrase = phrase_id
484496
# Update recognition parameters
485-
if disfluency_removal_enabled is not None:
486-
self._kwargs[
487-
"disfluency_removal_enabled"
488-
] = disfluency_removal_enabled
489-
if diarization_enabled is not None:
490-
self._kwargs["diarization_enabled"] = diarization_enabled
491-
if speaker_count is not None:
492-
self._kwargs["speaker_count"] = speaker_count
493-
if timestamp_alignment_enabled is not None:
494-
self._kwargs[
495-
"timestamp_alignment_enabled"
496-
] = timestamp_alignment_enabled
497-
if special_word_filter is not None:
498-
self._kwargs["special_word_filter"] = special_word_filter
499-
if audio_event_detection_enabled is not None:
500-
self._kwargs[
501-
"audio_event_detection_enabled"
502-
] = audio_event_detection_enabled
497+
_merge_recognition_params(
498+
self._kwargs,
499+
disfluency_removal_enabled,
500+
diarization_enabled,
501+
speaker_count,
502+
timestamp_alignment_enabled,
503+
special_word_filter,
504+
audio_event_detection_enabled,
505+
)
503506
self._kwargs.update(**kwargs)
504507
error_flag: bool = False
505508
sentences: List[Any] = []

0 commit comments

Comments
 (0)