volcengine-python-sdk 4.0.27__py2.py3-none-any.whl → 4.0.29__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of volcengine-python-sdk might be problematic. Click here for more details.
- {volcengine_python_sdk-4.0.27.dist-info → volcengine_python_sdk-4.0.29.dist-info}/METADATA +1 -1
- {volcengine_python_sdk-4.0.27.dist-info → volcengine_python_sdk-4.0.29.dist-info}/RECORD +278 -17
- {volcengine_python_sdk-4.0.27.dist-info → volcengine_python_sdk-4.0.29.dist-info}/top_level.txt +1 -0
- volcenginesdkarkruntime/_client.py +7 -6
- volcenginesdkarkruntime/_utils/_key_agreement.py +18 -14
- volcenginesdkarkruntime/resources/batch_chat/completions.py +10 -141
- volcenginesdkarkruntime/resources/beta/chat/completions.py +10 -0
- volcenginesdkarkruntime/resources/chat/completions.py +9 -206
- volcenginesdkarkruntime/resources/encryption.py +209 -0
- volcenginesdkarkruntime/resources/images/images.py +72 -55
- volcenginesdkarkruntime/types/content_generation/content_generation_task.py +15 -0
- volcenginesdkarkruntime/types/images/__init__.py +2 -2
- volcenginesdkarkruntime/types/images/images.py +7 -1
- volcenginesdkarkruntime/types/shared/reasoning_effort.py +17 -0
- volcenginesdkcore/api_client.py +1 -1
- volcenginesdkcore/configuration.py +1 -1
- volcenginesdkid/__init__.py +276 -0
- volcenginesdkid/api/__init__.py +6 -0
- volcenginesdkid/api/id_api.py +7891 -0
- volcenginesdkid/models/__init__.py +272 -0
- volcenginesdkid/models/api_key_auth_config_for_batch_get_inbound_auth_config_output.py +201 -0
- volcenginesdkid/models/api_key_auth_config_for_create_api_key_input.py +201 -0
- volcenginesdkid/models/api_key_auth_config_for_create_inbound_auth_config_input.py +201 -0
- volcenginesdkid/models/api_key_auth_config_for_create_inbound_auth_config_output.py +201 -0
- volcenginesdkid/models/api_key_auth_config_for_get_inbound_auth_config_output.py +201 -0
- volcenginesdkid/models/api_key_auth_config_for_list_inbound_auth_configs_output.py +201 -0
- volcenginesdkid/models/api_key_auth_config_for_update_inbound_auth_config_input.py +201 -0
- volcenginesdkid/models/api_key_credential_provider_for_batch_get_api_key_credential_providers_output.py +201 -0
- volcenginesdkid/models/api_key_credential_provider_for_list_api_key_credential_providers_output.py +201 -0
- volcenginesdkid/models/api_key_metadata_for_batch_get_inbound_auth_config_output.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_create_api_key_credential_provider_input.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_create_api_key_input.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_create_inbound_auth_config_input.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_create_inbound_auth_config_output.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_get_api_key_credential_provider_output.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_get_inbound_auth_config_output.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_get_resource_api_key_output.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_list_inbound_auth_configs_output.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_update_api_key_credential_provider_input.py +149 -0
- volcenginesdkid/models/api_key_metadata_for_update_inbound_auth_config_input.py +149 -0
- volcenginesdkid/models/attach_inbound_auth_config_request.py +151 -0
- volcenginesdkid/models/attach_inbound_auth_config_response.py +95 -0
- volcenginesdkid/models/authorization_server_metadata_for_create_oauth2_credential_provider_input.py +201 -0
- volcenginesdkid/models/authorization_server_metadata_for_get_oauth2_credential_provider_output.py +201 -0
- volcenginesdkid/models/authorization_server_metadata_for_update_oauth2_credential_provider_input.py +201 -0
- volcenginesdkid/models/batch_get_api_key_credential_providers_request.py +149 -0
- volcenginesdkid/models/batch_get_api_key_credential_providers_response.py +123 -0
- volcenginesdkid/models/batch_get_inbound_auth_config_request.py +123 -0
- volcenginesdkid/models/batch_get_inbound_auth_config_response.py +123 -0
- volcenginesdkid/models/batch_get_oauth2_credential_providers_request.py +149 -0
- volcenginesdkid/models/batch_get_oauth2_credential_providers_response.py +123 -0
- volcenginesdkid/models/check_api_key_request.py +124 -0
- volcenginesdkid/models/check_api_key_response.py +95 -0
- volcenginesdkid/models/check_permission_request.py +254 -0
- volcenginesdkid/models/check_permission_response.py +149 -0
- volcenginesdkid/models/config_for_create_oauth2_credential_provider_input.py +331 -0
- volcenginesdkid/models/config_for_get_oauth2_credential_provider_output.py +331 -0
- volcenginesdkid/models/config_for_update_oauth2_credential_provider_input.py +331 -0
- volcenginesdkid/models/create_api_key_credential_provider_request.py +203 -0
- volcenginesdkid/models/create_api_key_credential_provider_response.py +175 -0
- volcenginesdkid/models/create_api_key_request.py +150 -0
- volcenginesdkid/models/create_api_key_response.py +95 -0
- volcenginesdkid/models/create_identity_provider_o_auth_request.py +419 -0
- volcenginesdkid/models/create_identity_provider_o_auth_response.py +409 -0
- volcenginesdkid/models/create_identity_provider_oidc_request.py +365 -0
- volcenginesdkid/models/create_identity_provider_oidc_response.py +357 -0
- volcenginesdkid/models/create_inbound_auth_config_request.py +254 -0
- volcenginesdkid/models/create_inbound_auth_config_response.py +357 -0
- volcenginesdkid/models/create_namespace_request.py +149 -0
- volcenginesdkid/models/create_namespace_response.py +175 -0
- volcenginesdkid/models/create_oauth2_credential_provider_request.py +206 -0
- volcenginesdkid/models/create_oauth2_credential_provider_response.py +175 -0
- volcenginesdkid/models/create_policy_request.py +149 -0
- volcenginesdkid/models/create_policy_response.py +175 -0
- volcenginesdkid/models/create_user_pool_client_request.py +230 -0
- volcenginesdkid/models/create_user_pool_client_response.py +461 -0
- volcenginesdkid/models/create_user_pool_request.py +150 -0
- volcenginesdkid/models/create_user_pool_response.py +383 -0
- volcenginesdkid/models/create_user_request.py +410 -0
- volcenginesdkid/models/create_user_response.py +773 -0
- volcenginesdkid/models/create_users_csv_request.py +124 -0
- volcenginesdkid/models/create_users_csv_response.py +201 -0
- volcenginesdkid/models/create_users_request.py +150 -0
- volcenginesdkid/models/create_users_response.py +201 -0
- volcenginesdkid/models/create_workload_identity_request.py +228 -0
- volcenginesdkid/models/create_workload_identity_response.py +305 -0
- volcenginesdkid/models/create_workload_pool_request.py +149 -0
- volcenginesdkid/models/create_workload_pool_response.py +253 -0
- volcenginesdkid/models/credential_provider_for_list_credential_providers_output.py +253 -0
- volcenginesdkid/models/custom_parameters_for_create_oauth2_credential_provider_input.py +123 -0
- volcenginesdkid/models/custom_parameters_for_get_oauth2_credential_provider_output.py +123 -0
- volcenginesdkid/models/custom_parameters_for_get_resource_oauth2_token_input.py +123 -0
- volcenginesdkid/models/custom_parameters_for_update_oauth2_credential_provider_input.py +123 -0
- volcenginesdkid/models/data_for_list_identity_providers_o_auth_output.py +409 -0
- volcenginesdkid/models/data_for_list_identity_providers_oidc_output.py +357 -0
- volcenginesdkid/models/data_for_list_identity_providers_output.py +227 -0
- volcenginesdkid/models/data_for_list_policies_output.py +175 -0
- volcenginesdkid/models/data_for_list_user_pool_clients_output.py +253 -0
- volcenginesdkid/models/data_for_list_user_pools_output.py +279 -0
- volcenginesdkid/models/data_for_list_users_output.py +773 -0
- volcenginesdkid/models/delete_api_key_credential_provider_request.py +150 -0
- volcenginesdkid/models/delete_api_key_credential_provider_response.py +95 -0
- volcenginesdkid/models/delete_api_key_request.py +151 -0
- volcenginesdkid/models/delete_api_key_response.py +95 -0
- volcenginesdkid/models/delete_identity_provider_o_auth_request.py +151 -0
- volcenginesdkid/models/delete_identity_provider_o_auth_response.py +123 -0
- volcenginesdkid/models/delete_identity_provider_oidc_request.py +151 -0
- volcenginesdkid/models/delete_identity_provider_oidc_response.py +123 -0
- volcenginesdkid/models/delete_identity_provider_request.py +151 -0
- volcenginesdkid/models/delete_identity_provider_response.py +123 -0
- volcenginesdkid/models/delete_inbound_auth_config_request.py +124 -0
- volcenginesdkid/models/delete_inbound_auth_config_response.py +95 -0
- volcenginesdkid/models/delete_namespace_request.py +123 -0
- volcenginesdkid/models/delete_namespace_response.py +149 -0
- volcenginesdkid/models/delete_oauth2_credential_provider_request.py +150 -0
- volcenginesdkid/models/delete_oauth2_credential_provider_response.py +95 -0
- volcenginesdkid/models/delete_policy_request.py +149 -0
- volcenginesdkid/models/delete_policy_response.py +149 -0
- volcenginesdkid/models/delete_user_pool_client_request.py +151 -0
- volcenginesdkid/models/delete_user_pool_client_response.py +123 -0
- volcenginesdkid/models/delete_user_pool_request.py +124 -0
- volcenginesdkid/models/delete_user_pool_response.py +123 -0
- volcenginesdkid/models/delete_users_request.py +150 -0
- volcenginesdkid/models/delete_users_response.py +201 -0
- volcenginesdkid/models/delete_workload_identity_request.py +150 -0
- volcenginesdkid/models/delete_workload_identity_response.py +95 -0
- volcenginesdkid/models/delete_workload_pool_request.py +123 -0
- volcenginesdkid/models/delete_workload_pool_response.py +95 -0
- volcenginesdkid/models/detach_inbound_auth_config_request.py +151 -0
- volcenginesdkid/models/detach_inbound_auth_config_response.py +95 -0
- volcenginesdkid/models/entity_for_check_permission_input.py +149 -0
- volcenginesdkid/models/entry_for_create_oauth2_credential_provider_input.py +149 -0
- volcenginesdkid/models/entry_for_get_oauth2_credential_provider_output.py +149 -0
- volcenginesdkid/models/entry_for_get_resource_oauth2_token_input.py +149 -0
- volcenginesdkid/models/entry_for_update_oauth2_credential_provider_input.py +149 -0
- volcenginesdkid/models/filter_for_list_identity_providers_input.py +149 -0
- volcenginesdkid/models/filter_for_list_user_pool_clients_input.py +175 -0
- volcenginesdkid/models/filter_for_list_user_pools_input.py +201 -0
- volcenginesdkid/models/filter_for_list_users_input.py +435 -0
- volcenginesdkid/models/get_api_key_credential_provider_request.py +150 -0
- volcenginesdkid/models/get_api_key_credential_provider_response.py +279 -0
- volcenginesdkid/models/get_identity_provider_o_auth_request.py +151 -0
- volcenginesdkid/models/get_identity_provider_o_auth_response.py +409 -0
- volcenginesdkid/models/get_identity_provider_oidc_request.py +151 -0
- volcenginesdkid/models/get_identity_provider_oidc_response.py +357 -0
- volcenginesdkid/models/get_inbound_auth_config_request.py +124 -0
- volcenginesdkid/models/get_inbound_auth_config_response.py +357 -0
- volcenginesdkid/models/get_namespace_request.py +149 -0
- volcenginesdkid/models/get_namespace_response.py +201 -0
- volcenginesdkid/models/get_oauth2_credential_provider_request.py +150 -0
- volcenginesdkid/models/get_oauth2_credential_provider_response.py +305 -0
- volcenginesdkid/models/get_policy_request.py +149 -0
- volcenginesdkid/models/get_policy_response.py +175 -0
- volcenginesdkid/models/get_resource_api_key_request.py +177 -0
- volcenginesdkid/models/get_resource_api_key_response.py +149 -0
- volcenginesdkid/models/get_resource_oauth2_token_request.py +307 -0
- volcenginesdkid/models/get_resource_oauth2_token_response.py +149 -0
- volcenginesdkid/models/get_user_csv_template_request.py +124 -0
- volcenginesdkid/models/get_user_csv_template_response.py +95 -0
- volcenginesdkid/models/get_user_pool_client_request.py +151 -0
- volcenginesdkid/models/get_user_pool_client_response.py +461 -0
- volcenginesdkid/models/get_user_pool_request.py +124 -0
- volcenginesdkid/models/get_user_pool_response.py +383 -0
- volcenginesdkid/models/get_user_request.py +151 -0
- volcenginesdkid/models/get_user_response.py +773 -0
- volcenginesdkid/models/get_workload_access_token_for_jwt_request.py +176 -0
- volcenginesdkid/models/get_workload_access_token_for_jwt_response.py +149 -0
- volcenginesdkid/models/get_workload_access_token_for_user_id_request.py +176 -0
- volcenginesdkid/models/get_workload_access_token_for_user_id_response.py +149 -0
- volcenginesdkid/models/get_workload_access_token_request.py +149 -0
- volcenginesdkid/models/get_workload_access_token_response.py +149 -0
- volcenginesdkid/models/get_workload_identity_request.py +150 -0
- volcenginesdkid/models/get_workload_identity_response.py +305 -0
- volcenginesdkid/models/get_workload_pool_request.py +149 -0
- volcenginesdkid/models/get_workload_pool_response.py +253 -0
- volcenginesdkid/models/grant_permission_request.py +228 -0
- volcenginesdkid/models/grant_permission_response.py +175 -0
- volcenginesdkid/models/id_token_for_create_user_pool_client_output.py +123 -0
- volcenginesdkid/models/id_token_for_get_user_pool_client_output.py +123 -0
- volcenginesdkid/models/id_token_for_update_user_pool_client_input.py +123 -0
- volcenginesdkid/models/id_token_for_update_user_pool_client_output.py +123 -0
- volcenginesdkid/models/inbound_auth_config_for_batch_get_inbound_auth_config_output.py +357 -0
- volcenginesdkid/models/inbound_auth_config_for_list_inbound_auth_configs_output.py +357 -0
- volcenginesdkid/models/jwt_auth_config_for_batch_get_inbound_auth_config_output.py +175 -0
- volcenginesdkid/models/jwt_auth_config_for_create_inbound_auth_config_input.py +175 -0
- volcenginesdkid/models/jwt_auth_config_for_create_inbound_auth_config_output.py +175 -0
- volcenginesdkid/models/jwt_auth_config_for_get_inbound_auth_config_output.py +175 -0
- volcenginesdkid/models/jwt_auth_config_for_list_inbound_auth_configs_output.py +175 -0
- volcenginesdkid/models/jwt_auth_config_for_update_inbound_auth_config_input.py +175 -0
- volcenginesdkid/models/list_api_key_credential_providers_request.py +177 -0
- volcenginesdkid/models/list_api_key_credential_providers_response.py +201 -0
- volcenginesdkid/models/list_credential_providers_request.py +177 -0
- volcenginesdkid/models/list_credential_providers_response.py +201 -0
- volcenginesdkid/models/list_identity_providers_o_auth_request.py +124 -0
- volcenginesdkid/models/list_identity_providers_o_auth_response.py +201 -0
- volcenginesdkid/models/list_identity_providers_oidc_request.py +124 -0
- volcenginesdkid/models/list_identity_providers_oidc_response.py +201 -0
- volcenginesdkid/models/list_identity_providers_request.py +204 -0
- volcenginesdkid/models/list_identity_providers_response.py +201 -0
- volcenginesdkid/models/list_inbound_auth_configs_request.py +203 -0
- volcenginesdkid/models/list_inbound_auth_configs_response.py +201 -0
- volcenginesdkid/models/list_namespaces_request.py +149 -0
- volcenginesdkid/models/list_namespaces_response.py +201 -0
- volcenginesdkid/models/list_oauth2_credential_providers_request.py +177 -0
- volcenginesdkid/models/list_oauth2_credential_providers_response.py +201 -0
- volcenginesdkid/models/list_policies_request.py +123 -0
- volcenginesdkid/models/list_policies_response.py +123 -0
- volcenginesdkid/models/list_user_pool_clients_request.py +256 -0
- volcenginesdkid/models/list_user_pool_clients_response.py +201 -0
- volcenginesdkid/models/list_user_pools_request.py +229 -0
- volcenginesdkid/models/list_user_pools_response.py +201 -0
- volcenginesdkid/models/list_users_request.py +256 -0
- volcenginesdkid/models/list_users_response.py +201 -0
- volcenginesdkid/models/list_workload_identities_request.py +209 -0
- volcenginesdkid/models/list_workload_identities_response.py +201 -0
- volcenginesdkid/models/list_workload_pools_request.py +157 -0
- volcenginesdkid/models/list_workload_pools_response.py +201 -0
- volcenginesdkid/models/oauth2_callback_request.py +178 -0
- volcenginesdkid/models/oauth2_callback_response.py +123 -0
- volcenginesdkid/models/oauth2_credential_provider_for_batch_get_oauth2_credential_providers_output.py +227 -0
- volcenginesdkid/models/oauth2_credential_provider_for_list_oauth2_credential_providers_output.py +227 -0
- volcenginesdkid/models/oauth2_discovery_for_create_oauth2_credential_provider_input.py +149 -0
- volcenginesdkid/models/oauth2_discovery_for_get_oauth2_credential_provider_output.py +149 -0
- volcenginesdkid/models/oauth2_discovery_for_update_oauth2_credential_provider_input.py +149 -0
- volcenginesdkid/models/operation_for_check_permission_input.py +149 -0
- volcenginesdkid/models/operation_for_grant_permission_input.py +175 -0
- volcenginesdkid/models/original_caller_for_check_permission_input.py +149 -0
- volcenginesdkid/models/original_caller_for_grant_permission_input.py +175 -0
- volcenginesdkid/models/parent_for_check_permission_input.py +149 -0
- volcenginesdkid/models/principal_for_check_permission_input.py +149 -0
- volcenginesdkid/models/principal_for_grant_permission_input.py +175 -0
- volcenginesdkid/models/provider_options_for_create_identity_provider_o_auth_input.py +227 -0
- volcenginesdkid/models/provider_options_for_create_identity_provider_o_auth_output.py +227 -0
- volcenginesdkid/models/provider_options_for_create_identity_provider_oidc_input.py +227 -0
- volcenginesdkid/models/provider_options_for_create_identity_provider_oidc_output.py +227 -0
- volcenginesdkid/models/provider_options_for_get_identity_provider_o_auth_output.py +227 -0
- volcenginesdkid/models/provider_options_for_get_identity_provider_oidc_output.py +227 -0
- volcenginesdkid/models/provider_options_for_list_identity_providers_o_auth_output.py +227 -0
- volcenginesdkid/models/provider_options_for_list_identity_providers_oidc_output.py +227 -0
- volcenginesdkid/models/provider_options_for_update_identity_provider_o_auth_input.py +227 -0
- volcenginesdkid/models/provider_options_for_update_identity_provider_o_auth_output.py +227 -0
- volcenginesdkid/models/provider_options_for_update_identity_provider_oidc_input.py +227 -0
- volcenginesdkid/models/provider_options_for_update_identity_provider_oidc_output.py +227 -0
- volcenginesdkid/models/reference_for_check_permission_input.py +149 -0
- volcenginesdkid/models/refresh_token_for_create_user_pool_client_output.py +227 -0
- volcenginesdkid/models/refresh_token_for_get_user_pool_client_output.py +227 -0
- volcenginesdkid/models/refresh_token_for_update_user_pool_client_input.py +227 -0
- volcenginesdkid/models/refresh_token_for_update_user_pool_client_output.py +227 -0
- volcenginesdkid/models/resource_for_check_permission_input.py +149 -0
- volcenginesdkid/models/resource_for_grant_permission_input.py +175 -0
- volcenginesdkid/models/update_api_key_credential_provider_request.py +202 -0
- volcenginesdkid/models/update_api_key_credential_provider_response.py +227 -0
- volcenginesdkid/models/update_identity_provider_o_auth_request.py +440 -0
- volcenginesdkid/models/update_identity_provider_o_auth_response.py +409 -0
- volcenginesdkid/models/update_identity_provider_oidc_request.py +388 -0
- volcenginesdkid/models/update_identity_provider_oidc_response.py +357 -0
- volcenginesdkid/models/update_inbound_auth_config_request.py +202 -0
- volcenginesdkid/models/update_inbound_auth_config_response.py +95 -0
- volcenginesdkid/models/update_namespace_request.py +149 -0
- volcenginesdkid/models/update_namespace_response.py +149 -0
- volcenginesdkid/models/update_oauth2_credential_provider_request.py +176 -0
- volcenginesdkid/models/update_oauth2_credential_provider_response.py +227 -0
- volcenginesdkid/models/update_user_pool_client_request.py +359 -0
- volcenginesdkid/models/update_user_pool_client_response.py +461 -0
- volcenginesdkid/models/update_user_pool_request.py +176 -0
- volcenginesdkid/models/update_user_pool_response.py +383 -0
- volcenginesdkid/models/update_user_request.py +411 -0
- volcenginesdkid/models/update_user_response.py +773 -0
- volcenginesdkid/models/update_workload_identity_request.py +202 -0
- volcenginesdkid/models/update_workload_identity_response.py +95 -0
- volcenginesdkid/models/update_workload_pool_request.py +149 -0
- volcenginesdkid/models/update_workload_pool_response.py +95 -0
- volcenginesdkid/models/user_for_create_users_input.py +383 -0
- volcenginesdkid/models/workload_identity_for_list_workload_identities_output.py +305 -0
- volcenginesdkid/models/workload_pool_for_list_workload_pools_output.py +253 -0
- {volcengine_python_sdk-4.0.27.dist-info → volcengine_python_sdk-4.0.29.dist-info}/WHEEL +0 -0
- {volcengine_python_sdk-4.0.27.dist-info → volcengine_python_sdk-4.0.29.dist-info}/licenses/LICENSE.txt +0 -0
- {volcengine_python_sdk-4.0.27.dist-info → volcengine_python_sdk-4.0.29.dist-info}/licenses/NOTICE.md +0 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from .._constants import ARK_E2E_ENCRYPTION_HEADER
|
|
3
|
+
from .._streaming import Stream, AsyncStream
|
|
4
|
+
from ..types.chat import (
|
|
5
|
+
ChatCompletion,
|
|
6
|
+
ChatCompletionChunk,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import json
|
|
11
|
+
import warnings
|
|
12
|
+
from copy import deepcopy
|
|
13
|
+
from typing import (
|
|
14
|
+
Union,
|
|
15
|
+
Iterable,
|
|
16
|
+
Callable,
|
|
17
|
+
Iterator,
|
|
18
|
+
AsyncIterator,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from .._utils._key_agreement import aes_gcm_decrypt_base64_string, aes_gcm_decrypt_base64_list, decrypt_validate
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _decrypt_chunk(
|
|
25
|
+
key: bytes, nonce: bytes, resp: Stream[ChatCompletionChunk]
|
|
26
|
+
) -> Iterator[ChatCompletionChunk]:
|
|
27
|
+
for chunk in resp:
|
|
28
|
+
if chunk.choices is not None:
|
|
29
|
+
for index, choice in enumerate(chunk.choices):
|
|
30
|
+
if (
|
|
31
|
+
choice.delta is not None and choice.delta.content is not None
|
|
32
|
+
and choice.finish_reason != 'content_filter'
|
|
33
|
+
):
|
|
34
|
+
choice.delta.content = aes_gcm_decrypt_base64_string(
|
|
35
|
+
key, nonce, choice.delta.content
|
|
36
|
+
)
|
|
37
|
+
chunk.choices[index] = choice
|
|
38
|
+
yield chunk
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def _async_decrypt_chunk(
|
|
42
|
+
key: bytes, nonce: bytes, resp: AsyncStream[ChatCompletionChunk]
|
|
43
|
+
) -> AsyncIterator[ChatCompletionChunk]:
|
|
44
|
+
async for chunk in resp:
|
|
45
|
+
if chunk.choices is not None:
|
|
46
|
+
for index, choice in enumerate(chunk.choices):
|
|
47
|
+
if (
|
|
48
|
+
choice.delta is not None and choice.delta.content is not None
|
|
49
|
+
and choice.finish_reason != 'content_filter'
|
|
50
|
+
):
|
|
51
|
+
choice.delta.content = aes_gcm_decrypt_base64_string(
|
|
52
|
+
key, nonce, choice.delta.content
|
|
53
|
+
)
|
|
54
|
+
chunk.choices[index] = choice
|
|
55
|
+
yield chunk
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _decrypt(
|
|
59
|
+
key: bytes,
|
|
60
|
+
nonce: bytes,
|
|
61
|
+
resp: Union[ChatCompletion, Stream[ChatCompletionChunk]]
|
|
62
|
+
) -> ChatCompletion | Stream[ChatCompletionChunk]:
|
|
63
|
+
if isinstance(resp, ChatCompletion):
|
|
64
|
+
if resp.choices is not None:
|
|
65
|
+
for index, choice in enumerate(resp.choices):
|
|
66
|
+
if (
|
|
67
|
+
choice.message is not None and choice.finish_reason != 'content_filter'
|
|
68
|
+
and choice.message.content is not None
|
|
69
|
+
):
|
|
70
|
+
try:
|
|
71
|
+
content = aes_gcm_decrypt_base64_string(
|
|
72
|
+
key, nonce, choice.message.content
|
|
73
|
+
)
|
|
74
|
+
except Exception:
|
|
75
|
+
content = ''
|
|
76
|
+
if content == '' or not decrypt_validate(choice.message.content):
|
|
77
|
+
content = aes_gcm_decrypt_base64_list(
|
|
78
|
+
key, nonce, choice.message.content
|
|
79
|
+
)
|
|
80
|
+
choice.message.content = content
|
|
81
|
+
resp.choices[index] = choice
|
|
82
|
+
return resp
|
|
83
|
+
else:
|
|
84
|
+
return Stream._make_stream_from_iterator(
|
|
85
|
+
_decrypt_chunk(key, nonce, resp)
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
async def _async_decrypt(
|
|
90
|
+
key: bytes,
|
|
91
|
+
nonce: bytes,
|
|
92
|
+
resp: ChatCompletion | AsyncStream[ChatCompletionChunk],
|
|
93
|
+
) -> ChatCompletion | AsyncStream[ChatCompletionChunk]:
|
|
94
|
+
if isinstance(resp, ChatCompletion):
|
|
95
|
+
if resp.choices is not None:
|
|
96
|
+
for index, choice in enumerate(resp.choices):
|
|
97
|
+
if (
|
|
98
|
+
choice.message is not None and choice.finish_reason != 'content_filter'
|
|
99
|
+
and choice.message.content is not None
|
|
100
|
+
):
|
|
101
|
+
try:
|
|
102
|
+
content = aes_gcm_decrypt_base64_string(
|
|
103
|
+
key, nonce, choice.message.content
|
|
104
|
+
)
|
|
105
|
+
except Exception:
|
|
106
|
+
content = ''
|
|
107
|
+
if content == '' or not decrypt_validate(choice.message.content):
|
|
108
|
+
content = aes_gcm_decrypt_base64_list(
|
|
109
|
+
key, nonce, choice.message.content
|
|
110
|
+
)
|
|
111
|
+
choice.message.content = content
|
|
112
|
+
resp.choices[index] = choice
|
|
113
|
+
return resp
|
|
114
|
+
else:
|
|
115
|
+
return AsyncStream._make_stream_from_iterator(
|
|
116
|
+
_async_decrypt_chunk(key, nonce, resp)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def with_e2e_encryption(func):
|
|
121
|
+
def wrapper(*args, **kwargs):
|
|
122
|
+
is_encrypt, _crypto_key, _crypto_nonce = _content_encryption(
|
|
123
|
+
args, kwargs)
|
|
124
|
+
resp = func(*args, **kwargs)
|
|
125
|
+
if is_encrypt:
|
|
126
|
+
resp = _decrypt(_crypto_key, _crypto_nonce, resp)
|
|
127
|
+
return resp
|
|
128
|
+
|
|
129
|
+
return wrapper
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def async_with_e2e_encryption(func):
|
|
133
|
+
async def wrapper(*args, **kwargs):
|
|
134
|
+
is_encrypt, _crypto_key, _crypto_nonce = _content_encryption(
|
|
135
|
+
args, kwargs)
|
|
136
|
+
resp = await func(*args, **kwargs)
|
|
137
|
+
if is_encrypt:
|
|
138
|
+
resp = await _async_decrypt(_crypto_key, _crypto_nonce, resp)
|
|
139
|
+
return resp
|
|
140
|
+
|
|
141
|
+
return wrapper
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _content_encryption(args, kwargs):
|
|
145
|
+
assert len(args) > 0
|
|
146
|
+
extra_headers = (
|
|
147
|
+
kwargs.get("extra_headers") if kwargs.get("extra_headers") else {}
|
|
148
|
+
)
|
|
149
|
+
if (
|
|
150
|
+
extra_headers is not None
|
|
151
|
+
and extra_headers.get(ARK_E2E_ENCRYPTION_HEADER, None) == "true"
|
|
152
|
+
):
|
|
153
|
+
model: str = kwargs.get("model", "")
|
|
154
|
+
messages = deepcopy(kwargs["messages"])
|
|
155
|
+
ark_client = args[0]._client
|
|
156
|
+
client, ring_id, key_id, exp_time = ark_client._get_endpoint_certificate(
|
|
157
|
+
model)
|
|
158
|
+
_crypto_key, _crypto_nonce, session_token = client.generate_ecies_key_pair()
|
|
159
|
+
extra_headers["X-Session-Token"] = session_token
|
|
160
|
+
_process_messages(
|
|
161
|
+
messages,
|
|
162
|
+
lambda x: client.encrypt_string_with_key(
|
|
163
|
+
_crypto_key, _crypto_nonce, x),
|
|
164
|
+
)
|
|
165
|
+
info = {"ExpireTime": exp_time}
|
|
166
|
+
if os.environ.get("VOLC_ARK_ENCRYPTION") == "AICC":
|
|
167
|
+
info["Version"] = 'AICCv0.1'
|
|
168
|
+
info["KeyID"] = key_id
|
|
169
|
+
info["RingID"] = ring_id
|
|
170
|
+
extra_headers["X-Encrypt-Info"] = json.dumps(info)
|
|
171
|
+
kwargs["extra_headers"] = {**extra_headers}
|
|
172
|
+
kwargs["messages"] = messages
|
|
173
|
+
return True, _crypto_key, _crypto_nonce
|
|
174
|
+
return False, None, None
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _process_messages(
|
|
178
|
+
messages, f: Callable[[str], str]
|
|
179
|
+
):
|
|
180
|
+
for message in messages:
|
|
181
|
+
if message.get("content", None) is not None:
|
|
182
|
+
current_content = message.get("content")
|
|
183
|
+
if isinstance(current_content, str):
|
|
184
|
+
message["content"] = f(current_content)
|
|
185
|
+
elif isinstance(current_content, Iterable):
|
|
186
|
+
for part in current_content:
|
|
187
|
+
if part.get("type", None) == "text":
|
|
188
|
+
part["text"] = f(part["text"])
|
|
189
|
+
elif part.get("type", None) == "image_url":
|
|
190
|
+
if part["image_url"]["url"].startswith("data:"):
|
|
191
|
+
part["image_url"]["url"] = f(
|
|
192
|
+
part["image_url"]["url"])
|
|
193
|
+
else:
|
|
194
|
+
warnings.warn(
|
|
195
|
+
"encryption is not supported for image url, "
|
|
196
|
+
"please use base64 image if you want encryption"
|
|
197
|
+
)
|
|
198
|
+
else:
|
|
199
|
+
raise TypeError(
|
|
200
|
+
"encryption is not supported for content type {}".format(
|
|
201
|
+
type(part)
|
|
202
|
+
)
|
|
203
|
+
)
|
|
204
|
+
else:
|
|
205
|
+
raise TypeError(
|
|
206
|
+
"encryption is not supported for content type {}".format(
|
|
207
|
+
type(message.get("content"))
|
|
208
|
+
)
|
|
209
|
+
)
|
|
@@ -21,10 +21,11 @@ from ..._types import NOT_GIVEN, NotGiven
|
|
|
21
21
|
from ..._base_client import make_request_options
|
|
22
22
|
from ..._utils._utils import apikey_required, async_apikey_required
|
|
23
23
|
from ..._resource import SyncAPIResource, AsyncAPIResource
|
|
24
|
-
from ...types.images import SequentialImageGenerationOptions, ImagesResponse
|
|
24
|
+
from ...types.images import OptimizePromptOptions, SequentialImageGenerationOptions, ImagesResponse
|
|
25
25
|
from ...types.images.image_gen_stream_event import ImageGenStreamEvent
|
|
26
26
|
from ..._types import Body, Query, Headers
|
|
27
27
|
from ..._streaming import Stream
|
|
28
|
+
from ...types.images.images import OptimizePromptOptions
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
class Images(SyncAPIResource):
|
|
@@ -41,6 +42,7 @@ class Images(SyncAPIResource):
|
|
|
41
42
|
guidance_scale: float | None = None,
|
|
42
43
|
watermark: bool | None = None,
|
|
43
44
|
optimize_prompt: bool | None = None,
|
|
45
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
44
46
|
extra_headers: Headers | None = None,
|
|
45
47
|
extra_query: Query | None = None,
|
|
46
48
|
extra_body: Body | None = None,
|
|
@@ -72,6 +74,7 @@ class Images(SyncAPIResource):
|
|
|
72
74
|
guidance_scale: float | None = None,
|
|
73
75
|
watermark: bool | None = None,
|
|
74
76
|
optimize_prompt: bool | None = None,
|
|
77
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
75
78
|
extra_headers: Headers | None = None,
|
|
76
79
|
extra_query: Query | None = None,
|
|
77
80
|
extra_body: Body | None = None,
|
|
@@ -95,6 +98,7 @@ class Images(SyncAPIResource):
|
|
|
95
98
|
guidance_scale: float | None = None,
|
|
96
99
|
watermark: bool | None = None,
|
|
97
100
|
optimize_prompt: bool | None = None,
|
|
101
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
98
102
|
extra_headers: Headers | None = None,
|
|
99
103
|
extra_query: Query | None = None,
|
|
100
104
|
extra_body: Body | None = None,
|
|
@@ -118,6 +122,7 @@ class Images(SyncAPIResource):
|
|
|
118
122
|
guidance_scale: float | None = None,
|
|
119
123
|
watermark: bool | None = None,
|
|
120
124
|
optimize_prompt: bool | None = None,
|
|
125
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
121
126
|
extra_headers: Headers | None = None,
|
|
122
127
|
extra_query: Query | None = None,
|
|
123
128
|
extra_body: Body | None = None,
|
|
@@ -138,6 +143,10 @@ class Images(SyncAPIResource):
|
|
|
138
143
|
"guidance_scale": guidance_scale,
|
|
139
144
|
"watermark": watermark,
|
|
140
145
|
"optimize_prompt": optimize_prompt,
|
|
146
|
+
"optimize_prompt_options": (
|
|
147
|
+
optimize_prompt_options.model_dump(mode="json")
|
|
148
|
+
if optimize_prompt_options is not None else None
|
|
149
|
+
),
|
|
141
150
|
"sequential_image_generation": sequential_image_generation,
|
|
142
151
|
"sequential_image_generation_options": (
|
|
143
152
|
sequential_image_generation_options.model_dump(mode="json")
|
|
@@ -162,70 +171,73 @@ class Images(SyncAPIResource):
|
|
|
162
171
|
class AsyncImages(AsyncAPIResource):
|
|
163
172
|
@overload
|
|
164
173
|
async def generate(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
174
|
+
self,
|
|
175
|
+
*,
|
|
176
|
+
model: str,
|
|
177
|
+
prompt: str,
|
|
178
|
+
image: str | list[str] | None = None,
|
|
179
|
+
response_format: str | None = None,
|
|
180
|
+
size: str | None = None,
|
|
181
|
+
seed: int | None = None,
|
|
182
|
+
guidance_scale: float | None = None,
|
|
183
|
+
watermark: bool | None = None,
|
|
184
|
+
optimize_prompt: bool | None = None,
|
|
185
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
186
|
+
extra_headers: Headers | None = None,
|
|
187
|
+
extra_query: Query | None = None,
|
|
188
|
+
extra_body: Body | None = None,
|
|
189
|
+
timeout: float | httpx.Timeout | None = None,
|
|
190
|
+
sequential_image_generation: str | None = None,
|
|
191
|
+
sequential_image_generation_options: SequentialImageGenerationOptions | None = None,
|
|
192
|
+
stream: Optional[Literal[False]] | NotGiven = NOT_GIVEN,
|
|
183
193
|
) -> ImagesResponse:
|
|
184
194
|
...
|
|
185
195
|
|
|
186
196
|
@overload
|
|
187
197
|
async def generate(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
198
|
+
self,
|
|
199
|
+
*,
|
|
200
|
+
model: str,
|
|
201
|
+
prompt: str,
|
|
202
|
+
image: str | list[str] | None = None,
|
|
203
|
+
response_format: str | None = None,
|
|
204
|
+
size: str | None = None,
|
|
205
|
+
seed: int | None = None,
|
|
206
|
+
guidance_scale: float | None = None,
|
|
207
|
+
watermark: bool | None = None,
|
|
208
|
+
optimize_prompt: bool | None = None,
|
|
209
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
210
|
+
extra_headers: Headers | None = None,
|
|
211
|
+
extra_query: Query | None = None,
|
|
212
|
+
extra_body: Body | None = None,
|
|
213
|
+
timeout: float | httpx.Timeout | None = None,
|
|
214
|
+
sequential_image_generation: str | None = None,
|
|
215
|
+
sequential_image_generation_options: SequentialImageGenerationOptions | None = None,
|
|
216
|
+
stream: Literal[True],
|
|
206
217
|
) -> Stream[ImageGenStreamEvent]:
|
|
207
218
|
...
|
|
208
219
|
|
|
209
220
|
@overload
|
|
210
221
|
async def generate(
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
222
|
+
self,
|
|
223
|
+
*,
|
|
224
|
+
model: str,
|
|
225
|
+
prompt: str,
|
|
226
|
+
image: str | list[str] | None = None,
|
|
227
|
+
response_format: str | None = None,
|
|
228
|
+
size: str | None = None,
|
|
229
|
+
seed: int | None = None,
|
|
230
|
+
guidance_scale: float | None = None,
|
|
231
|
+
watermark: bool | None = None,
|
|
232
|
+
optimize_prompt: bool | None = None,
|
|
233
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
234
|
+
extra_headers: Headers | None = None,
|
|
235
|
+
extra_query: Query | None = None,
|
|
236
|
+
extra_body: Body | None = None,
|
|
237
|
+
timeout: float | httpx.Timeout | None = None,
|
|
238
|
+
sequential_image_generation: str | None = None,
|
|
239
|
+
sequential_image_generation_options: SequentialImageGenerationOptions | None = None,
|
|
240
|
+
stream: bool,
|
|
229
241
|
) -> ImagesResponse | Stream[ImageGenStreamEvent]:
|
|
230
242
|
...
|
|
231
243
|
|
|
@@ -242,6 +254,7 @@ class AsyncImages(AsyncAPIResource):
|
|
|
242
254
|
guidance_scale: float | None = None,
|
|
243
255
|
watermark: bool | None = None,
|
|
244
256
|
optimize_prompt: bool | None = None,
|
|
257
|
+
optimize_prompt_options: OptimizePromptOptions | None = None,
|
|
245
258
|
extra_headers: Headers | None = None,
|
|
246
259
|
extra_query: Query | None = None,
|
|
247
260
|
extra_body: Body | None = None,
|
|
@@ -262,6 +275,10 @@ class AsyncImages(AsyncAPIResource):
|
|
|
262
275
|
"guidance_scale": guidance_scale,
|
|
263
276
|
"watermark": watermark,
|
|
264
277
|
"optimize_prompt": optimize_prompt,
|
|
278
|
+
"optimize_prompt_options": (
|
|
279
|
+
optimize_prompt_options.model_dump(mode="json")
|
|
280
|
+
if optimize_prompt_options is not None else None
|
|
281
|
+
),
|
|
265
282
|
"sequential_image_generation": sequential_image_generation,
|
|
266
283
|
"sequential_image_generation_options": (
|
|
267
284
|
sequential_image_generation_options.model_dump(mode="json")
|
|
@@ -27,6 +27,9 @@ class Content(BaseModel):
|
|
|
27
27
|
last_frame_url: str
|
|
28
28
|
"""The URL of the last frame of the generated video, if any."""
|
|
29
29
|
|
|
30
|
+
file_url: str
|
|
31
|
+
"""The URL of the generated file, if any."""
|
|
32
|
+
|
|
30
33
|
|
|
31
34
|
class ContentGenerationError(BaseModel):
|
|
32
35
|
message: str
|
|
@@ -55,6 +58,18 @@ class ContentGenerationTask(BaseModel):
|
|
|
55
58
|
usage: Usage
|
|
56
59
|
"""The usage information for the task."""
|
|
57
60
|
|
|
61
|
+
subdivisionlevel: str
|
|
62
|
+
"""The subdivision level of the task."""
|
|
63
|
+
|
|
64
|
+
fileformat: str
|
|
65
|
+
"""The file format of the generated content."""
|
|
66
|
+
|
|
67
|
+
frames: int
|
|
68
|
+
"""The number of frames in the generated content."""
|
|
69
|
+
|
|
70
|
+
framespersecond: int
|
|
71
|
+
"""The number of frames per second in the generated content."""
|
|
72
|
+
|
|
58
73
|
created_at: int
|
|
59
74
|
"""The Unix timestamp when the task was created."""
|
|
60
75
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# This modified file is released under the same license.
|
|
12
12
|
|
|
13
|
-
from .images import SequentialImageGenerationOptions, ImagesResponse
|
|
13
|
+
from .images import OptimizePromptOptions, SequentialImageGenerationOptions, ImagesResponse
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
__all__ = ["SequentialImageGenerationOptions", "ImagesResponse"]
|
|
16
|
+
__all__ = ["OptimizePromptOptions", "SequentialImageGenerationOptions", "ImagesResponse"]
|
|
@@ -14,13 +14,19 @@ from typing import List, Optional
|
|
|
14
14
|
|
|
15
15
|
from volcenginesdkarkruntime._models import BaseModel
|
|
16
16
|
|
|
17
|
-
__all__ = ["SequentialImageGenerationOptions", "ImagesResponse"]
|
|
17
|
+
__all__ = ["OptimizePromptOptions", "SequentialImageGenerationOptions", "ImagesResponse"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class OptimizePromptOptions(BaseModel):
|
|
21
|
+
thinking: Optional[str] = None
|
|
22
|
+
mode: Optional[str] = None
|
|
18
23
|
|
|
19
24
|
|
|
20
25
|
class SequentialImageGenerationOptions(BaseModel):
|
|
21
26
|
max_images: Optional[int] = None
|
|
22
27
|
""" Maximum number of images to generate in this request; effective only when the multi-image feature is enabled """
|
|
23
28
|
|
|
29
|
+
|
|
24
30
|
class Usage(BaseModel):
|
|
25
31
|
generated_images: int
|
|
26
32
|
"""The number of images generated."""
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
# Copyright (c) [2025] [OpenAI]
|
|
3
|
+
# Copyright (c) [2025] [ByteDance Ltd. and/or its affiliates.]
|
|
4
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
#
|
|
6
|
+
# This file has been modified by [ByteDance Ltd. and/or its affiliates.] on 2025.7
|
|
7
|
+
#
|
|
8
|
+
# Original file was released under Apache License Version 2.0, with the full license text
|
|
9
|
+
# available at https://github.com/openai/openai-python/blob/main/LICENSE.
|
|
10
|
+
#
|
|
11
|
+
# This modified file is released under the same license.
|
|
12
|
+
from typing import Optional
|
|
13
|
+
from typing_extensions import Literal, TypeAlias
|
|
14
|
+
|
|
15
|
+
__all__ = ["ReasoningEffort"]
|
|
16
|
+
|
|
17
|
+
ReasoningEffort: TypeAlias = Optional[Literal["minimal", "low", "medium", "high"]]
|
volcenginesdkcore/api_client.py
CHANGED
|
@@ -64,7 +64,7 @@ class ApiClient(object):
|
|
|
64
64
|
self.default_headers[header_name] = header_value
|
|
65
65
|
self.cookie = cookie
|
|
66
66
|
# Set default User-Agent.
|
|
67
|
-
self.user_agent = 'volcstack-python-sdk/4.0.
|
|
67
|
+
self.user_agent = 'volcstack-python-sdk/4.0.29'
|
|
68
68
|
self.client_side_validation = configuration.client_side_validation
|
|
69
69
|
|
|
70
70
|
self.interceptor_chain = InterceptorChain()
|
|
@@ -272,7 +272,7 @@ class Configuration(six.with_metaclass(TypeWithDefault, object)):
|
|
|
272
272
|
"OS: {env}\n" \
|
|
273
273
|
"Python Version: {pyversion}\n" \
|
|
274
274
|
"Version of the API: 0.1.0\n" \
|
|
275
|
-
"SDK Package Version: 4.0.
|
|
275
|
+
"SDK Package Version: 4.0.29".\
|
|
276
276
|
format(env=sys.platform, pyversion=sys.version)
|
|
277
277
|
|
|
278
278
|
@property
|