Appearance
Примеры использования
Готовые примеры загрузки датасетов через API на разных языках программирования.
Python
Полный пример с обработкой ошибок
python
import requests
import os
import sys
API_KEY = os.getenv('ABLABZ_API_KEY')
BASE_URL = 'https://workbench.ab-labz.com/api/v1'
FILE_PATH = 'dataset.csv'
EXPERIMENT_ID = 'homepage_test'
def upload_dataset(file_path: str, experiment_id: str) -> bool:
"""
Загружает датасет в AB-Labz Workbench через API.
Args:
file_path: путь к CSV файлу
experiment_id: идентификатор эксперимента
Returns:
True если загрузка успешна
Raises:
requests.HTTPError: при ошибках API
FileNotFoundError: если файл не найден
"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"Файл не найден: {file_path}")
file_size_mb = os.path.getsize(file_path) / (1024 * 1024)
print(f"🚀 Загрузка датасета для эксперимента '{experiment_id}'")
print(f"📦 Размер файла: {file_size_mb:.2f} МБ")
# 1. Получить URL для загрузки
print("⏳ Получение ссылки для загрузки...")
response = requests.post(
f'{BASE_URL}/datasets/initiate/',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'experiment_id': experiment_id}
)
response.raise_for_status()
data = response.json()
upload_url = data['upload_url']
print(f"✅ Ссылка получена (действительна {data['expires_in']} сек)")
# 2. Загрузить файл
print("⬆️ Загрузка файла в хранилище...")
with open(file_path, 'rb') as f:
upload_response = requests.put(
upload_url,
headers={'Content-Type': 'text/csv'},
data=f
)
upload_response.raise_for_status()
print("✅ Файл успешно загружен!")
print(f"📊 Датасет доступен в UI: Подготовка данных → Получить по API")
return True
if __name__ == '__main__':
try:
upload_dataset(FILE_PATH, EXPERIMENT_ID)
except requests.HTTPError as e:
print(f"❌ Ошибка API: {e.response.status_code}")
print(f" {e.response.text}")
sys.exit(1)
except FileNotFoundError as e:
print(f"❌ {e}")
sys.exit(1)
except Exception as e:
print(f"❌ Неожиданная ошибка: {e}")
sys.exit(1)
Минимальный пример
python
import requests
API_KEY = 'abn_xxxxxxxxxxxxxxxxxxxxx'
BASE_URL = 'https://workbench.ab-labz.com/api/v1'
FILE_PATH = 'dataset.csv'
# 1. Получить URL для загрузки
response = requests.post(
f'{BASE_URL}/datasets/initiate/',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'experiment_id': 'homepage_test'}
)
upload_url = response.json()['upload_url']
# 2. Загрузить файл
with open(FILE_PATH, 'rb') as f:
requests.put(upload_url, data=f, headers={'Content-Type': 'text/csv'})
print("✅ Датасет загружен!")
Bash (cURL)
Полный скрипт
bash
#!/bin/bash
set -e # Остановка при ошибках
# Конфигурация
API_KEY="${ABLABZ_API_KEY}"
BASE_URL="https://workbench.ab-labz.com/api/v1"
EXPERIMENT_ID="homepage_test"
FILE_PATH="dataset.csv"
# Цвета для вывода
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Проверка наличия файла
if [ ! -f "$FILE_PATH" ]; then
echo -e "${RED}❌ Файл не найден: $FILE_PATH${NC}"
exit 1
fi
FILE_SIZE_MB=$(awk "BEGIN {printf \"%.2f\", $(wc -c < "$FILE_PATH") / 1048576}")
echo -e "${BLUE}🚀 Загрузка датасета для эксперимента '$EXPERIMENT_ID'${NC}"
echo -e "${BLUE}📦 Размер файла: $FILE_SIZE_MB МБ${NC}"
# 1. Получить URL для загрузки
echo -e "${BLUE}⏳ Получение ссылки для загрузки...${NC}"
RESPONSE=$(curl -s -X POST "$BASE_URL/datasets/initiate/" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "{\"experiment_id\": \"$EXPERIMENT_ID\"}")
# Проверка ошибок
if [ $? -ne 0 ]; then
echo -e "${RED}❌ Ошибка при получении ссылки${NC}"
exit 1
fi
# Извлечение данных из JSON
UPLOAD_URL=$(echo "$RESPONSE" | jq -r '.upload_url')
EXPIRES_IN=$(echo "$RESPONSE" | jq -r '.expires_in')
if [ "$UPLOAD_URL" = "null" ] || [ -z "$UPLOAD_URL" ]; then
echo -e "${RED}❌ Не удалось получить ссылку для загрузки${NC}"
echo "$RESPONSE"
exit 1
fi
echo -e "${GREEN}✅ Ссылка получена (действительна $EXPIRES_IN сек)${NC}"
# 2. Загрузка файла
echo -e "${BLUE}⬆️ Загрузка файла в хранилище...${NC}"
HTTP_CODE=$(curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: text/csv" \
--data-binary @"$FILE_PATH" \
-o /dev/null \
-w "%{http_code}" \
-s)
if [ "$HTTP_CODE" -ne 200 ]; then
echo -e "${RED}❌ Ошибка загрузки. HTTP код: $HTTP_CODE${NC}"
exit 1
fi
echo -e "${GREEN}✅ Файл успешно загружен!${NC}"
echo -e "${GREEN}📊 Датасет доступен в UI: Подготовка данных → Получить по API${NC}"
Минимальный скрипт
bash
#!/bin/bash
set -e
API_KEY="abn_xxxxxxxxxxxxxxxxxxxxx"
BASE_URL="https://workbench.ab-labz.com/api/v1"
EXPERIMENT_ID="homepage_test"
FILE_PATH="dataset.csv"
# 1. Получить URL для загрузки
echo "🚀 Получение ссылки..."
RESPONSE=$(curl -s -X POST "$BASE_URL/datasets/initiate/" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "{\"experiment_id\": \"$EXPERIMENT_ID\"}")
UPLOAD_URL=$(echo $RESPONSE | jq -r '.upload_url')
# 2. Загрузить файл
echo "⬆️ Загрузка файла..."
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: text/csv" \
--data-binary @"$FILE_PATH" \
-w "\nHTTP: %{http_code}\n"
echo "✅ Готово!"
GitHub Actions
Автоматическая загрузка датасета при изменении файла:
yaml
name: Upload Dataset to AB-Labz Workbench
on:
push:
branches: [main]
paths:
- 'data/experiment_data.csv'
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Upload dataset
env:
ABLABZ_API_KEY: ${{ secrets.ABLABZ_API_KEY }}
BASE_URL: https://workbench.ab-labz.com/api/v1
EXPERIMENT_ID: homepage_test
FILE_PATH: data/experiment_data.csv
run: |
# Получить URL для загрузки
RESPONSE=$(curl -s -X POST "$BASE_URL/datasets/initiate/" \
-H "Authorization: Bearer $ABLABZ_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"experiment_id\": \"$EXPERIMENT_ID\"}")
UPLOAD_URL=$(echo $RESPONSE | jq -r '.upload_url')
# Загрузить файл
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: text/csv" \
--data-binary @"$FILE_PATH"
echo "✅ Dataset uploaded successfully!"
Интеграция с ETL процессом
Пример для Airflow, cron или других планировщиков:
python
#!/usr/bin/env python3
# upload_to_ablabz.py
import os
import requests
import pandas as pd
from datetime import datetime
import logging
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
API_KEY = os.getenv('ABLABZ_API_KEY')
BASE_URL = 'https://workbench.ab-labz.com/api/v1'
EXPERIMENT_ID = 'homepage_test'
def export_data_from_db():
"""Экспорт данных из БД в CSV"""
# Пример с PostgreSQL
import psycopg2
conn = psycopg2.connect(
host="localhost",
database="analytics",
user="user",
password=os.getenv('DB_PASSWORD')
)
query = """
SELECT user_id, variant, date, conversion, revenue
FROM experiment_data
WHERE date >= CURRENT_DATE - INTERVAL '14 days'
AND experiment_id = 'homepage_test'
"""
df = pd.read_sql(query, conn)
conn.close()
csv_path = f'/tmp/experiment_{datetime.now().strftime("%Y%m%d")}.csv'
df.to_csv(csv_path, index=False)
logging.info(f"Exported {len(df)} rows to {csv_path}")
return csv_path
def upload_to_ablabz(file_path, experiment_id):
"""Загрузка файла в AB-Labz Workbench"""
logging.info(f"Uploading {file_path} for experiment {experiment_id}")
# 1. Получить URL для загрузки
response = requests.post(
f'{BASE_URL}/datasets/initiate/',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'experiment_id': experiment_id}
)
response.raise_for_status()
upload_url = response.json()['upload_url']
# 2. Загрузить файл
with open(file_path, 'rb') as f:
upload_response = requests.put(
upload_url,
data=f,
headers={'Content-Type': 'text/csv'}
)
upload_response.raise_for_status()
logging.info("Upload successful!")
return True
if __name__ == '__main__':
try:
csv_path = export_data_from_db()
upload_to_ablabz(csv_path, EXPERIMENT_ID)
os.remove(csv_path) # Очистка
except Exception as e:
logging.error(f"Error: {e}")
raise
Добавьте в crontab для ежедневной загрузки:
bash
# Загрузка данных каждый день в 3:00
0 3 * * * /usr/bin/python3 /opt/scripts/upload_to_ablabz.py
AB-Labz Library