diff --git a/dashscope/aigc/generation.py b/dashscope/aigc/generation.py index 03645f7..54f1792 100644 --- a/dashscope/aigc/generation.py +++ b/dashscope/aigc/generation.py @@ -149,6 +149,12 @@ def call( to_merge_incremental_output = True parameters['incremental_output'] = True + # Pass incremental_to_full flag via headers user-agent + if 'headers' not in parameters: + parameters['headers'] = {} + flag = '1' if to_merge_incremental_output else '0' + parameters['headers']['user-agent'] = f'incremental_to_full/{flag}' + response = super().call(model=model, task_group=task_group, task=Generation.task, @@ -354,6 +360,12 @@ async def call( to_merge_incremental_output = True parameters['incremental_output'] = True + # Pass incremental_to_full flag via headers user-agent + if 'headers' not in parameters: + parameters['headers'] = {} + flag = '1' if to_merge_incremental_output else '0' + parameters['headers']['user-agent'] = f'incremental_to_full/{flag}' + response = await super().call(model=model, task_group=task_group, task=Generation.task, diff --git a/dashscope/aigc/multimodal_conversation.py b/dashscope/aigc/multimodal_conversation.py index bf30e5a..361b1f8 100644 --- a/dashscope/aigc/multimodal_conversation.py +++ b/dashscope/aigc/multimodal_conversation.py @@ -120,6 +120,12 @@ def call( to_merge_incremental_output = True kwargs['incremental_output'] = True + # Pass incremental_to_full flag via headers user-agent + if 'headers' not in kwargs: + kwargs['headers'] = {} + flag = '1' if to_merge_incremental_output else '0' + kwargs['headers']['user-agent'] = f'incremental_to_full/{flag}' + response = super().call(model=model, task_group=task_group, task=MultiModalConversation.task, @@ -287,6 +293,15 @@ async def call( to_merge_incremental_output = True kwargs['incremental_output'] = True + # Pass incremental_to_full flag via headers user-agent + if 'headers' not in kwargs: + kwargs['headers'] = {} + flag = '1' if to_merge_incremental_output else '0' + kwargs['headers']['user-agent'] = ( + kwargs['headers'].get('user-agent', '') + + f'; incremental_to_full/{flag}' + ) + response = await super().call(model=model, task_group=task_group, task=AioMultiModalConversation.task, diff --git a/dashscope/api_entities/aiohttp_request.py b/dashscope/api_entities/aiohttp_request.py index f7aeda3..1f0bcd0 100644 --- a/dashscope/api_entities/aiohttp_request.py +++ b/dashscope/api_entities/aiohttp_request.py @@ -23,7 +23,8 @@ def __init__(self, async_request: bool = False, query: bool = False, timeout: int = DEFAULT_REQUEST_TIMEOUT_SECONDS, - task_id: str = None) -> None: + task_id: str = None, + user_agent: str = '') -> None: """HttpSSERequest, processing http server sent event stream. Args: @@ -33,9 +34,11 @@ def __init__(self, stream (bool, optional): Is stream request. Defaults to True. timeout (int, optional): Total request timeout. Defaults to DEFAULT_REQUEST_TIMEOUT_SECONDS. + user_agent (str, optional): Additional user agent string to + append. Defaults to ''. """ - super().__init__() + super().__init__(user_agent=user_agent) self.url = url self.async_request = async_request self.headers = { diff --git a/dashscope/api_entities/api_request_factory.py b/dashscope/api_entities/api_request_factory.py index cef4783..3666ecd 100644 --- a/dashscope/api_entities/api_request_factory.py +++ b/dashscope/api_entities/api_request_factory.py @@ -31,9 +31,15 @@ def _get_protocol_params(kwargs): base_address = kwargs.pop('base_address', None) flattened_output = kwargs.pop('flattened_output', False) extra_url_parameters = kwargs.pop('extra_url_parameters', None) + + # Extract user-agent from headers if present + user_agent = '' + if headers and 'user-agent' in headers: + user_agent = headers.pop('user-agent') + return (api_protocol, ws_stream_mode, is_binary_input, http_method, stream, async_request, query, headers, request_timeout, form, resources, - base_address, flattened_output, extra_url_parameters) + base_address, flattened_output, extra_url_parameters, user_agent) def _build_api_request(model: str, @@ -46,8 +52,8 @@ def _build_api_request(model: str, **kwargs): (api_protocol, ws_stream_mode, is_binary_input, http_method, stream, async_request, query, headers, request_timeout, form, resources, - base_address, flattened_output, - extra_url_parameters) = _get_protocol_params(kwargs) + base_address, flattened_output, extra_url_parameters, + user_agent) = _get_protocol_params(kwargs) task_id = kwargs.pop('task_id', None) enable_encryption = kwargs.pop('enable_encryption', False) encryption = None @@ -87,7 +93,8 @@ def _build_api_request(model: str, timeout=request_timeout, task_id=task_id, flattened_output=flattened_output, - encryption=encryption) + encryption=encryption, + user_agent=user_agent) elif api_protocol == ApiProtocol.WEBSOCKET: if base_address is not None: websocket_url = base_address @@ -101,7 +108,8 @@ def _build_api_request(model: str, is_binary_input=is_binary_input, timeout=request_timeout, flattened_output=flattened_output, - pre_task_id=pre_task_id) + pre_task_id=pre_task_id, + user_agent=user_agent) else: raise UnsupportedApiProtocol( 'Unsupported protocol: %s, support [http, https, websocket]' % diff --git a/dashscope/api_entities/base_request.py b/dashscope/api_entities/base_request.py index ef84b01..05db0d9 100644 --- a/dashscope/api_entities/base_request.py +++ b/dashscope/api_entities/base_request.py @@ -9,7 +9,7 @@ class BaseRequest(ABC): - def __init__(self) -> None: + def __init__(self, user_agent: str = '') -> None: try: platform_info = platform.platform() except Exception: @@ -26,6 +26,11 @@ def __init__(self) -> None: platform_info, processor_info, ) + + # Append user_agent if provided and not empty + if user_agent: + ua += '; ' + user_agent + self.headers = {'user-agent': ua} disable_data_inspection = os.environ.get( DASHSCOPE_DISABLE_DATA_INSPECTION_ENV, 'true') diff --git a/dashscope/api_entities/http_request.py b/dashscope/api_entities/http_request.py index 2811d1b..386a03e 100644 --- a/dashscope/api_entities/http_request.py +++ b/dashscope/api_entities/http_request.py @@ -33,7 +33,8 @@ def __init__(self, timeout: int = DEFAULT_REQUEST_TIMEOUT_SECONDS, task_id: str = None, flattened_output: bool = False, - encryption: Optional[Encryption] = None) -> None: + encryption: Optional[Encryption] = None, + user_agent: str = '') -> None: """HttpSSERequest, processing http server sent event stream. Args: @@ -43,9 +44,11 @@ def __init__(self, stream (bool, optional): Is stream request. Defaults to True. timeout (int, optional): Total request timeout. Defaults to DEFAULT_REQUEST_TIMEOUT_SECONDS. + user_agent (str, optional): Additional user agent string to + append. Defaults to ''. """ - super().__init__() + super().__init__(user_agent=user_agent) self.url = url self.flattened_output = flattened_output self.async_request = async_request diff --git a/dashscope/api_entities/websocket_request.py b/dashscope/api_entities/websocket_request.py index f763e51..2d99787 100644 --- a/dashscope/api_entities/websocket_request.py +++ b/dashscope/api_entities/websocket_request.py @@ -34,8 +34,9 @@ def __init__( timeout: int = DEFAULT_REQUEST_TIMEOUT_SECONDS, flattened_output: bool = False, pre_task_id=None, + user_agent: str = '', ) -> None: - super().__init__() + super().__init__(user_agent=user_agent) """HttpRequest. Args: