Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Doku Kullanıcısı veri işlevleri programlama modeli, Doku'da işlev yazma desenlerini ve kavramlarını tanımlar.
fabric-user-data-functions SDK, çalıştırılabilir işlevleri yazmak ve yayımlamak için gerekli işlevleri sağlayarak bu programlama modelini uygular. SDK ayrıca Doku ekosistemindeki Doku veri kaynakları gibi diğer öğelerle sorunsuz bir şekilde tümleştirmenizi sağlar. Bu kitaplık PyPI'de genel kullanıma açıktır ve kullanıcı verileri işlevleri öğelerinizde önceden yüklenmiştir.
Bu makalede, REST API kullanılarak Doku portalından, diğer Doku öğelerinden veya dış uygulamalardan çağrılabilen işlevler oluşturmak için SDK'nın nasıl kullanılacağı açıklanmaktadır. Programlama modelini ve temel kavramları pratik örneklerle öğrenirsiniz.
Tavsiye
Tüm sınıflar, yöntemler ve parametrelerle ilgili tüm ayrıntılar için SDK başvuru belgelerine bakın.
SDK ile çalışmaya başlama
Bu bölümde, Kullanıcı Verileri İşlevleri SDK'sının temel bileşenleri tanıtılarak işlevlerinizin nasıl yapılandırılması açıklanır. Gerekli içeri aktarmalar, dekoratörler ve işlevlerinizin işleyebileceği giriş ve çıkış veri türleri hakkında bilgi ediniyorsunuz.
Kullanıcı verileri işlevleri SDK'sı
SDK, fabric-user-data-functions Python'da kullanıcı verileri işlevleri oluşturmak için ihtiyacınız olan temel bileşenleri sağlar.
Gerekli importlar ve başlatma işlemleri
Her kullanıcı veri işlevleri dosyasının fabric.functions modülünü içe aktarması ve yürütme bağlamını başlatması gerekir.
import datetime
import fabric.functions as fn
import logging
udf = fn.UserDataFunctions()
Dekoratör @udf.function()
Dekoratörle @udf.function() işaretlenmiş işlevler Doku portalından, başka bir Doku öğesinden veya bir dış uygulamadan çağrılabilir. Bu dekoratöre sahip işlevler bir dönüş türü belirtmelidir.
Örnek:
@udf.function()
def hello_fabric(name: str) -> str:
logging.info('Python UDF trigger function processed a request.')
logging.info('Executing hello fabric function.')
return f"Welcome to Fabric Functions, {name}, at {datetime.datetime.now()}!"
Yardımcı işlevler
Dekoratör olmadan @udf.function() Python yöntemleri doğrudan çağrılamaz. Bunlar yalnızca dekore edilmiş işlevlerden çağrılabilir ve yardımcı işlevler olarak görev yapabilir.
Örnek:
def uppercase_name(name: str) -> str:
return name.upper()
Desteklenen giriş türleri
str, int, float gibi ilkel veri türleri gibi işlev için giriş parametreleri tanımlayabilirsiniz. Desteklenen giriş veri türleri şunlardır:
| JSON Türü | Python Veri Türü |
|---|---|
| Dizgi | str |
| Tarih saat dizesi | tarih/zaman |
| Boolean | Boole |
| Sayılar | int (tamsayı), float (kesirli sayı) |
| Dizi | list[], örnek liste[int] |
| Nesne | Dict |
| Nesne | pandas DataFrame |
| Nesne veya Nesne Dizisi | pandas Serisi |
Uyarı
pandas DataFrame ve Series türlerini kullanmak için Doku portalına gidin, çalışma alanınızı bulun ve kullanıcı verileri işlevleri öğenizi açın.
Kitaplık yönetimi'nifabric-user-data-functions seçin, paketi arayın ve 1.0.0 veya sonraki bir sürüme güncelleştirin.
Desteklenen giriş türleri için istek gövdesi örneği:
{
"name": "Alice", // String (str)
"signup_date": "2025-11-08T13:44:40Z", // Datetime string (datetime)
"is_active": true, // Boolean (bool)
"age": 30, // Number (int)
"height": 5.6, // Number (float)
"favorite_numbers": [3, 7, 42], // Array (list[int])
"profile": { // Object (dict)
"email": "alice@example.com",
"location": "Sammamish"
},
"sales_data": { // Object (pandas DataFrame)
"2025-11-01": {"product": "A", "units": 10},
"2025-11-02": {"product": "B", "units": 15}
},
"weekly_scores": [ // Object or Array of Objects (pandas Series)
{"week": 1, "score": 88},
{"week": 2, "score": 92},
{"week": 3, "score": 85}
]
}
Desteklenen çıkış türleri
Desteklenen çıkış veri türleri şunlardır:
| Python Veri Türü |
|---|
| str |
| tarih/zaman |
| Boole |
| int (tamsayı), float (kesirli sayı) |
| list[data-type], örneğin list[int] |
| Dict |
| Hiç kimse |
| pandas Serisi |
| pandas DataFrame |
İşlev yazma
Söz dizimi gereksinimleri ve sınırlamaları
Kullanıcı Verileri İşlevleri yazarken, işlevlerinizin düzgün çalıştığından emin olmak için belirli söz dizimi kurallarına uymanız gerekir.
Parametre adlandırma
-
camelCase kullan: Parametre adları camelCase adlandırma kuralını kullanmalıdır ve alt çizgi içeremez. Örneğin,
productNameyerineproduct_namekullanın. -
Ayrılmış anahtar sözcükler: Ayrılmış Python anahtar sözcüklerini veya dokuya özgü şu anahtar sözcükleri parametre adları veya işlev adları olarak kullanamazsınız:
req,contextvereqInvocationId.
Parametre gereksinimleri
-
Varsayılan değer yok: Varsayılan parametre değerleri desteklenmez. Bir işlev çağrılırken tüm parametreler gereklidir. Örneğin, aşağıdaki işlev bir söz dizimi hatası oluşturur:
# The default value for the argument called 'name' is not supported and treated like a syntax error. @udf.function() def goodbye_fabric(name: str = "N/A") -> str: return f"Goodbye, {name}." -
Tür ek açıklamaları gerekli: Tüm parametreler tür ek açıklamalarını içermelidir (örneğin,
name: str).
İşlev gereksinimleri
-
Dönüş türü gerekli: Dekoratörlü
@udf.function()işlevler bir dönüş türü belirtimi yapılmalıdır (örneğin,-> str). -
Gerekli içeri aktarmalar:
import fabric.functions as fndeyimi veudf = fn.UserDataFunctions()başlatma işlevlerinizin çalışması için gereklidir.
Doğru söz dizimi örneği
@udf.function()
def process_order(orderNumber: int, customerName: str, orderDate: str) -> dict:
return {
"order_id": orderNumber,
"customer": customerName,
"date": orderDate,
"status": "processed"
}
Asenkron işlev yazma
Kodunuzda fonksiyon tanımınızda asenkron dekoratör ekleyin. Bir async işlevle, birden çok görevi aynı anda işleyerek uygulamanızın yanıt hızını ve verimliliğini geliştirebilirsiniz. Yüksek hacimli G/Ç bağlantılı işlemleri yönetmek için idealdir. Bu örnek işlev, pandas kullanarak bir göl evinden CSV dosyasını okur. İşlev, giriş parametresi olarak dosya adını alır.
import pandas as pd
# Replace the alias "<My Lakehouse alias>" with your connection alias.
@udf.connection(argName="myLakehouse", alias="<My Lakehouse alias>")
@udf.function()
async def read_csv_from_lakehouse(myLakehouse: fn.FabricLakehouseClient, csvFileName: str) -> str:
# Connect to the Lakehouse
connection = myLakehouse.connectToFilesAsync()
# Download the CSV file from the Lakehouse
csvFile = connection.get_file_client(csvFileName)
downloadFile = await csvFile.download_file()
csvData = await downloadFile.readall()
# Read the CSV data into a pandas DataFrame
from io import StringIO
df = pd.read_csv(StringIO(csvData.decode('utf-8')))
# Display the DataFrame
result=""
for index, row in df.iterrows():
result=result + "["+ (",".join([str(item) for item in row]))+"]"
# Close the connection
csvFile.close()
connection.close()
return f"CSV file read successfully.{result}"
Verilerle çalışma
Fabric veri kaynaklarına veri bağlantıları
SDK, kodunuzda bağlantı dizeleri yazmaya gerek kalmadan veri bağlantılarına başvurmanızı sağlar.
fabric.functions kitaplığı, veri bağlantılarını işlemek için iki yol sunar.
- fabric.functions.FabricSqlConnection: SQL Analytics uç noktaları ve Doku ambarları dahil olmak üzere Doku'daki SQL veritabanlarıyla çalışmanıza olanak tanır.
- fabric.functions.FabricLakehouseClient: Lakehouse tablolarına ve dosyalarına bağlanmanıza olanak tanıyarak Lakehouse'larla çalışmanıza imkan tanır.
Bir veri kaynağına referansta bulunmak için @udf.connection dekoratörünü kullanmanız gerekir. Aşağıdaki biçimlerden herhangi birinde uygulayabilirsiniz:
@udf.connection(alias="<alias for data connection>", argName="sqlDB")@udf.connection("<alias for data connection>", "<argName>")@udf.connection("<alias for data connection>")
@udf.connection için bağımsız değişkenler şunlardır:
-
argName, bağlantının işlevinizde kullandığı değişkenin adı. -
alias, Bağlantıları Yönet menüsüyle eklediğiniz bağlantının takma adıdır. - ve
argNameaynı değere sahipsealiaskullanabilirsiniz@udf.connection("<alias and argName for the data connection>").
Örnek
# Where demosqldatabase is the argument name and the alias for my data connection used for this function
@udf.connection("demosqldatabase")
@udf.function()
def read_from_sql_db(demosqldatabase: fn.FabricSqlConnection)-> list:
# Connect to the SQL database
connection = demosqldatabase.connect()
cursor = connection.cursor()
# Replace with the query you want to run
query = "SELECT * FROM (VALUES ('John Smith', 31), ('Kayla Jones', 33)) AS Employee(EmpName, DepID);"
# Execute the query
cursor.execute(query)
# Fetch all results
results = cursor.fetchall()
# Close the cursor and connection
cursor.close()
connection.close()
return results
Fabric öğeleri veya Azure kaynakları için genel bağlantılar
SDK, Kullanıcı Verileri İşlevleri öğe sahibi kimliğinizi kullanarak Doku öğelerine veya Azure kaynaklarına bağlantı oluşturmanıza olanak sağlayan genel bağlantıları destekler. Bu özellik, öğe sahibinin kimliğine ve sağlanan hedef kitle türüne sahip bir Microsoft Entra Id belirteci oluşturur. Bu belirteç, bu hedef kitle türünü destekleyen Doku öğeleri veya Azure kaynaklarıyla kimlik doğrulaması yapmak için kullanılır. Bu yaklaşım, Bağlantıları Yönet özelliğinden yönetilen bağlantılar nesnelerini kullanmaya benzer bir programlama deneyimi sağlar, ancak yalnızca bağlantıda sağlanan hedef kitle türü için kullanılır.
Bu özellik aşağıdaki @udf.generic_connection() parametrelerle dekoratör kullanır:
| Parametre | Açıklama | Değer |
|---|---|---|
argName |
İşleve geçirilen değişkenin adı. Kullanıcının işlevinin bağımsız değişkenlerinde bu değişkeni belirtmesi ve bunun için türünü fn.FabricItem kullanması gerekir |
Örneğin, eğer argName=CosmosDb ise işlevi bu bağımsız değişkeni içermelidir. cosmosDb: fn.FabricItem |
audienceType |
Bağlantının oluşturulduğu hedef kitle türü. Bu parametre Doku öğesi veya Azure hizmeti türüyle ilişkilendirilir ve bağlantı için kullanılan istemciyi belirler. | Bu parametre için izin verilen değerler CosmosDb veya KeyVault şeklindedir. |
Genel bağlantı kullanarak Fabric Cosmos DB kapsayıcısına bağlanın
Genel bağlantılar, CosmosDB izleyici türünü kullanarak özgün Fabric Cosmos DB öğelerini destekler. Dahil edilen Kullanıcı Verileri İşlevleri SDK'sı, her çağrı için tek bir Cosmos DB istemcisi getiren adlı get_cosmos_client bir yardımcı yöntem sağlar.
Şu adımları izleyerek genel bir bağlantı kullanarak bir Fabric Cosmos DB öğesine bağlanabilirsiniz:
Fabric portalına gidin, çalışma alanınızı bulun ve kullanıcı veri fonksiyonları öğesini açın. Kitaplık yönetimi'ni
azure-cosmosseçin, kitaplığı arayın ve yükleyin. Daha fazla bilgi için bkz. Kitaplıkları yönetme.Fabric Cosmos DB öğesi ayarlarınıza gidin.
Fabric Cosmos DB uç noktasının URL'sini alın.
Kullanıcı Verileri İşlevleri öğenize gidin. Doku Cosmos DB kapsayıcınıza bağlanmak ve Cosmos DB örnek veri kümesini kullanarak bir okuma sorgusu çalıştırmak için aşağıdaki örnek kodu kullanın. Aşağıdaki değişkenlerin değerlerini değiştirin:
-
COSMOS_DB_URIkullanarak Fabric Cosmos DB uç noktanızı kullanın. -
DB_NAMEifadesini, Doku Cosmos DB öğenizin adıyla değiştirin.
from fabric.functions.cosmosdb import get_cosmos_client import json @udf.generic_connection(argName="cosmosDb", audienceType="CosmosDB") @udf.function() def get_product_by_category(cosmosDb: fn.FabricItem, category: str) -> list: COSMOS_DB_URI = "YOUR_COSMOS_DB_URL" DB_NAME = "YOUR_COSMOS_DB_NAME" # Note: This is the Fabric item name CONTAINER_NAME = "SampleData" # Note: This is your container name. In this example, we are using the SampleData container. cosmosClient = get_cosmos_client(cosmosDb, COSMOS_DB_URI) # Get the database and container database = cosmosClient.get_database_client(DB_NAME) container = database.get_container_client(CONTAINER_NAME) query = 'select * from c WHERE c.category=@category' #"select * from c where c.category=@category" parameters = [ { "name": "@category", "value": category } ] results = container.query_items(query=query, parameters=parameters) items = [item for item in results] logging.info(f"Found {len(items)} products in {category}") return json.dumps(items)-
Çağırma parametrelerinde olduğu gibi bir kategori adı sağlayarak
Accessory.
Uyarı
Hesap URL'sini ve veritabanı adlarını kullanarak bir Azure Cosmos DB veritabanına bağlanmak için de bu adımları kullanabilirsiniz. Kullanıcı Veri İşlevleri sahip hesabının bu Azure Cosmos DB hesabı için erişim izinleri olması gerekir.
Genel bir bağlantı kullanarak Azure Key Vault'a bağlanma
Genel bağlantılar, KeyVault dinleyici türünü kullanarak Azure Key Vault'a bağlanmayı destekler. Bu tür bir bağlantı, Doku Kullanıcı Verileri İşlevleri sahibinin Azure Key Vault'a bağlanma izinlerine sahip olmasını gerektirir. Anahtarları, gizli dizileri veya sertifikaları ada göre almak için bu bağlantıyı kullanabilirsiniz.
Genel bir bağlantı kullanarak API çağrılarını yapmak için bir istemci sırrını almak üzere Azure Key Vault'a aşağıdaki adımları izleyerek bağlanabilirsiniz:
Fabric portalına gidin, çalışma alanınızı bulun ve kullanıcı verileri fonksiyonları öğenizi açın. Kitaplık yönetimi'ni seçin, ardından
requestsveazure-keyvault-secretskitaplıklarını arayıp yükleyin. Daha fazla bilgi için bkz. Kitaplıkları yönetme.Azure portalında AzureKey Vault kaynağınıza gidin ve anahtarınızın, gizli dizinizin veya sertifikanızın adını alın
Vault URI.Doku Kullanıcı Verileri İşlevleri öğenize dönün ve bu örneği kullanın. Bu örnekte, genel API'ye bağlanmak için Azure Key Vault'tan bir gizli dizi alıyoruz. Aşağıdaki değişkenlerin değerini değiştirin:
-
KEY_VAULT_URLile önceki adımda aldığınızVault URIöğesini kullanın. -
KEY_VAULT_SECRET_NAMEgizlinizin adıyla. -
API_URLdeğişkenine bağlanmak istediğiniz API'nin URL'sini ekleyin. Bu örnekte GET isteklerini kabul eden ve aşağıdaki parametreleriapi-keyverequest-bodyalan bir genel API'ye bağlandığınız varsayılır.
from azure.keyvault.secrets import SecretClient from azure.identity import DefaultAzureCredential import requests @udf.generic_connection(argName="keyVaultClient", audienceType="KeyVault") @udf.function() def retrieveNews(keyVaultClient: fn.FabricItem, requestBody:str) -> str: KEY_VAULT_URL = 'YOUR_KEY_VAULT_URL' KEY_VAULT_SECRET_NAME= 'YOUR_SECRET' API_URL = 'YOUR_API_URL' credential = keyVaultClient.get_access_token() client = SecretClient(vault_url=KEY_VAULT_URL, credential=credential) api_key = client.get_secret(KEY_VAULT_SECRET_NAME).value api_url = API_URL params = { "api-key": api_key, "request-body": requestBody } response = requests.get(api_url, params=params) data = "" if response.status_code == 200: data = response.json() else: print(f"Error {response.status_code}: {response.text}") return f"Response: {data}"-
Kodunuzda bir istek gövdesi sağlayarak bu işlevi test edin veya çalıştırın.
Gelişmiş özellikler
Programlama modeli, işlevleriniz üzerinde daha fazla denetim sağlayan gelişmiş desenleri tanımlar. SDK, aşağıdaki işlemleri yapmanızı sağlayan sınıflar ve yöntemler aracılığıyla bu desenleri uygular:
- İşlevinizi kimlerin çağırıp çağırma şekliyle ilgili çağrı meta verilerine erişme
- Yapılandırılmış hata yanıtlarıyla özel hata senaryolarını işleme
- Merkezi yapılandırma yönetimi için Fabric değişken kitaplıklarıyla tümleştirme yapın.
Uyarı
Kullanıcı Verileri İşlevleri istek boyutu, yürütme zaman aşımı ve yanıt boyutu için hizmet sınırlarına sahiptir. Bu sınırlar ve bunların nasıl zorunlu kılındıkları hakkında ayrıntılı bilgi için bkz. Hizmet ayrıntıları ve sınırlamaları.
UserDataFunctionContext kullanarak çağırma özelliklerini al
SDK nesnesini içerir UserDataFunctionContext . Bu nesne işlev çağırma meta verilerini içerir ve farklı çağırma mekanizmaları için (portal çağrısı ve REST API çağrısı gibi) belirli uygulama mantığı oluşturmak için kullanılabilir.
Aşağıdaki tabloda UserDataFunctionContext nesnesinin özellikleri gösterilmektedir.
| Özellik Adı | Veri Türü | Açıklama |
|---|---|---|
| çağrı_kimliği | String | Kullanıcı veri işlevlerinin öğesinin çağrılmasıyla ilişkili benzersiz GUID. |
| çalıştıran_kullanıcı | nesne | Çağrıyı yetkilendirmek için kullanılan kullanıcının bilgilerinin meta verileri. |
executing_user nesnesi aşağıdaki bilgileri içerir:
| Özellik Adı | Veri Türü | Açıklama |
|---|---|---|
| Oıd | dize (GUID) | İstek sahibi için sabit bir tanımlayıcı olan kullanıcının nesne kimliği. Bu, uygulamalar arasında bu işlevi çağırmak için kullanılan kullanıcı veya hizmet sorumlusunun doğrulanmış kimliğidir. |
| KiracıID | dize (GUID) | Kullanıcının oturum açtığı kiracının kimliği. |
| Tercih Edilen Kullanıcı Adı | String | Kullanıcı tarafından belirlenen, çağıran kullanıcının tercih edilen kullanıcı adı. Bu değer değişebilir. |
parametresine UserDataFunctionContext erişmek için işlev tanımının en üstünde aşağıdaki dekoratörü kullanmanız gerekir: @udf.context(argName="<parameter name>")
Örnek
@udf.context(argName="myContext")
@udf.function()
def getContext(myContext: fabric.functions.UserDataFunctionContext)-> str:
logging.info('Python UDF trigger function processed a request.')
return f"Hello oid = {myContext.executing_user['Oid']}, TenantId = {myContext.executing_user['TenantId']}, PreferredUsername = {myContext.executing_user['PreferredUsername']}, InvocationId = {myContext.invocation_id}"
UserThrownError ile işlenen bir hata atın
İşlevinizi geliştirirken, SDK'da mevcut olan UserThrownError sınıfını kullanarak beklenen bir hata yanıtı atabilirsiniz. Bu sınıfın bir kullanımı, kullanıcı tarafından sağlanan girişlerin iş doğrulama kurallarını geçememesi durumlarını yönetmektir.
Örnek
import datetime
@udf.function()
def raise_userthrownerror(age: int)-> str:
if age < 18:
raise fn.UserThrownError("You must be 18 years or older to use this service.", {"age": age})
return f"Welcome to Fabric Functions at {datetime.datetime.now()}!"
UserThrownError Sınıf oluşturucu iki parametre alır:
-
Message: Bu dize, bu işlevi çağıran uygulamaya hata iletisi olarak döndürülür. - Bu işlevi çağıran uygulamaya bir özellik sözlüğü döndürülür.
Fabric değişken kütüphanelerinden değişkenleri alma
Microsoft Fabric'teki Fabric değişken kitaplığı , çalışma alanı içindeki farklı öğeler arasında kullanılabilecek değişkenleri yönetmeye yönelik merkezi bir depodur. Geliştiricilerin öğe yapılandırmalarını verimli bir şekilde özelleştirmesine ve paylaşmasına olanak tanır. Henüz bir değişken kitaplığınız yoksa bkz. Değişken kitaplıkları oluşturma ve yönetme.
İşlevlerinizde değişken kitaplığı kullanmak için, kullanıcı verileri işlevleri öğenizden bu kitaplığa bir bağlantı eklersiniz. Değişken kütüphaneleri OneLake kataloğunda SQL veritabanları ve lakehouse'lar gibi veri kaynaklarıyla birlikte görünür.
İşlevlerinizde değişken kitaplıkları kullanmak için şu adımları izleyin:
- Kullanıcı verileri işlevleri öğenize değişken kitaplığınıza bir bağlantı ekleyin . OneLake kataloğunda değişken kitaplığınızı bulup seçin, ardından Bağlan'ı seçin. Fabric'in bağlantı için oluşturduğu Alias'a dikkat edin.
- Değişken kitaplığı öğesi için bir bağlantı dekoratörü ekleyin. Örneğin,
@udf.connection(argName="varLib", alias="<My Variable Library Alias>")değişken kitaplık öğesi için yeni eklenen bağlantının diğer adını değiştirin. - İşlev tanımına türüne
fn.FabricVariablesClientsahip bir bağımsız değişken ekleyin. Bu istemci, değişkenler kitaplığı öğesiyle çalışmak için ihtiyacınız olan yöntemleri sağlar. - Değişken kitaplığındaki tüm değişkenleri almak için yöntemini kullanın
getVariables(). - Değişkenlerin değerlerini okumak için, ya
["variable-name"]ya da.get("variable-name")kullanın.
Örnek
Bu örnekte bir üretim ve geliştirme ortamı için yapılandırma senaryosu simülasyonu yapıyoruz. Bu işlev, Değişken Kitaplığı'ndan alınan bir değeri kullanarak seçili ortama bağlı olarak bir depolama yolu ayarlar. Değişken Kitaplığı, kullanıcıların ENV veya dev değerini ayarlayabildiği prod adlı bir değişken içerir.
@udf.connection(argName="varLib", alias="<My Variable Library Alias>")
@udf.function()
def get_storage_path(dataset: str, varLib: fn.FabricVariablesClient) -> str:
"""
Description: Determine storage path for a dataset based on environment configuration from Variable Library.
Args:
dataset_name (str): Name of the dataset to store.
varLib (fn.FabricVariablesClient): Fabric Variable Library connection.
Returns:
str: Full storage path for the dataset.
"""
# Retrieve variables from Variable Library
variables = varLib.getVariables()
# Get environment and base paths
env = variables.get("ENV")
dev_path = variables.get("DEV_FILE_PATH")
prod_path = variables.get("PROD_FILE_PATH")
# Apply environment-specific logic
if env.lower() == "dev":
return f"{dev_path}{dataset}/"
elif env.lower() == "prod":
return f"{prod_path}{dataset}/"
else:
return f"incorrect settings define for ENV variable"