Skip to content
On this page

Примеры использования

Готовые примеры загрузки датасетов через 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 - Лаборатория продуктовых экспериментов