OpenCode: terminal-native AI-агент для Data Engineering

OpenCode - open-source coding agent нового поколения. Разбираем архитектуру, model-agnostic подход, MCP, LSP, parallel sessions и почему это меняет DE-workflow.

platform

Почему обычного чат-бота мало для Data Engineer

Работа Data Engineer - это не только написание кода в IDE. Это:

  • Анализ логов Spark-задания в терминале (yarn logs -applicationId ...)
  • Отладка DAG'ов Airflow через CLI (airflow tasks test dag_id task_id 2024-01-01)
  • Проверка схем и партиций через spark-shell или beeline
  • Написание Terraform для Data Platform инфраструктуры
  • SSH на рабочий кластер и работа через Linux-утилиты

Классический чат-бот (ChatGPT, Claude.ai) разрывает контекст: вы копируете ошибку из терминала, вставляете в браузер, получаете ответ, копируете обратно. Этот цикл повторяется десятки раз за сессию отладки.

Контекстный разрыв - главная проблема. Агент не видит ваши файлы, не понимает структуру проекта, не может выполнить команду и проверить результат. Каждый раз всё с нуля.

Что такое OpenCode

OpenCode - open-source terminal-native coding agent. Он запускается прямо в терминале, имеет доступ к файловой системе, может выполнять команды, читать логи и взаимодействовать с инструментами вашего стека - всё в едином контексте.

Ключевые свойства:

  • Terminal-native: запускается в shell, не требует GUI или браузера
  • Open-source: код открыт, можно аудировать, форкать, расширять
  • Model-agnostic: подключается к Claude, GPT-4, Gemini или локальным моделям (Ollama)
  • Agentic: не просто отвечает, а самостоятельно выполняет цепочки действий

Архитектура: как устроен агент

Цикл работы агента (ReAct loop):

  1. Получить запрос от пользователя
  2. Обдумать (Thought): что нужно сделать, какой инструмент вызвать
  3. Действовать (Action): выполнить инструмент (прочитать файл, запустить команду)
  4. Наблюдать (Observation): получить результат
  5. Повторить пока задача не решена
  6. Ответить пользователю с результатом

Model-agnostic: свобода выбора модели

Одно из ключевых преимуществ OpenCode - нет привязки к одному провайдеру:

Зачем это важно для инженеров данных:

Сценарий Рекомендуемая модель Причина
Анализ сложного Spark-плана Claude Opus / GPT-4 Сложная reasoning задача
Генерация boilerplate PySpark Claude Haiku / Llama 8B Дёшево, быстро
Чувствительные данные / PII Ollama (локально) Данные не покидают инфраструктуру
SQL-трансформации DeepSeek Coder / GPT-4o Оптимизирован для кода
Документация Gemini Flash Быстро и недорого
# Переключение моделей в OpenCode:
opencode config set model claude-sonnet-4-5
opencode config set model gpt-4o
opencode config set model ollama/llama3.1:70b  # локальная через Ollama

LSP: агент понимает код, а не просто текст

Language Server Protocol (LSP) - стандарт, который IDE (VS Code, IntelliJ) используют для понимания кода: автодополнение, переход к определению, поиск использований, диагностика ошибок.

OpenCode подключается к тем же LSP-серверам, что и ваша IDE:

Пример ценности для DE:

Пользователь: "Найди все места, где используется функция load_events(),
и проверь, правильно ли передаются типы данных"

OpenCode (с LSP):
→ find_references("load_events")
   → [pipeline/etl.py:42, pipeline/backfill.py:17, tests/test_etl.py:89]
→ hover("load_events") → сигнатура: load_events(date: str, table: str) -> DataFrame
→ Читает etl.py:42: load_events(event_date, "events") - OK
→ Читает backfill.py:17: load_events(123, "events") - ОШИБКА: int вместо str!
→ "Нашёл проблему: backfill.py:17 передаёт int, ожидается str"

Без LSP агент мог бы только искать текст по файлам - и пропустить смысловые связи.

MCP: подключение к внешним инструментам

Model Context Protocol (MCP) - открытый стандарт от Anthropic для подключения AI-агентов к внешним системам. Вместо специальной интеграции для каждого инструмента - единый протокол.

Конкретные сценарии для Data Engineer:

# Через PostgreSQL MCP:
"Посмотри схему таблицы orders в prod-базе, напиши PySpark-код
для её репликации в S3 в Parquet"

# Через GitHub MCP:
"Найди все изменения в spark_jobs/etl.py за последний месяц
и проверь, не сломали ли они partition pruning"

# Через S3 MCP:
"Проверь структуру s3://data-lake/events/year=2024/,
посчитай количество файлов и их суммарный размер"

Skills: обучаем агента специфике DE

Skills (навыки) - повторно используемые цепочки действий, специфичные для вашего стека. Описываются как конфигурационные файлы или Python-скрипты:

# .opencode/skills/analyze-spark-log.yaml
name: analyze-spark-log
description: Анализирует логи Spark-задания и предлагает оптимизации
steps:
  - name: extract_errors
    tool: bash
    command: "grep -E 'ERROR|WARN|OOM|FetchFailed' {log_file} | tail -100"
  - name: check_gc
    tool: bash
    command: "grep 'GC overhead' {log_file} | wc -l"
  - name: analyze
    llm: true
    prompt: |
      Проанализируй эти логи Spark и определи:
      1. Основную причину проблемы
      2. Рекомендации по настройке памяти
      3. Предлагаемые изменения в коде
# .opencode/skills/check-hive-partition.yaml
name: check-hive-partition
description: Проверяет наличие и качество партиции в Hive/Delta
steps:
  - name: check_partition
    tool: bash
    command: |
      spark-sql -e "
        SHOW PARTITIONS {table} PARTITION (date='{date}');
        SELECT COUNT(*) FROM {table} WHERE date='{date}';
      "

Parallel Sessions: несколько агентов одновременно

OpenCode поддерживает запуск нескольких сессий параллельно - как tmux для AI:

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

  • Сессия 1 - агент анализирует логи упавшего Spark-задания
  • Сессия 2 - агент пишет исправленный код, пока первый ещё анализирует
  • Сессия 3 - агент готовит инфраструктуру для следующей версии

Каждая сессия имеет свою историю и контекст, но может обращаться к общим инструментам (файлы, MCP-серверы).

Почему это важно именно для Data Engineering

Data Engineer - один из самых инструментально нагруженных специалистов:

Все эти инструменты - CLI-ориентированные. IDE здесь - только один из многих. Terminal-native агент живёт там же, где живёт DE-workflow.

Реальные сценарии ценности

Сценарий 1: Отладка OOM в продакшн-Spark

DE: "spark-задание application_1234_5678 упало с OOM, вот путь к логам: /var/log/spark/"

OpenCode:
→ bash: grep -E "OutOfMemoryError|Java heap space" /var/log/spark/app_1234.log
→ bash: grep "GC overhead limit" /var/log/spark/app_1234.log | wc -l
→ read: spark_jobs/etl_daily.py
→ Нашёл: UDF обрабатывает строки без батчинга, объект в closure содержит большой DataFrame
→ "Проблема в etl_daily.py:87: closure захватывает reference_df (500MB).
   Предлагаю broadcast(reference_df) или вынести логику в Pandas UDF"
→ Пишет исправленный код
→ bash: python3 -m pytest tests/test_etl.py -v
→ Тесты прошли. Готово к деплою.

Сценарий 2: Исследование данных в S3

DE: "В s3://data-lake/events/ лежат Parquet файлы. Выясни схему и напиши PySpark-скрипт
для ежедневной агрегации по user_id с подсчётом событий по типу"

OpenCode:
→ MCP(S3): list_objects("data-lake", "events/")
→ bash: aws s3 cp s3://data-lake/events/year=2024/month=01/day=01/part-00000.parquet /tmp/
→ bash: python3 -c "import pyarrow.parquet as pq; print(pq.read_schema('/tmp/part-00000.parquet'))"
→ Схема: {user_id: string, event_type: string, ts: timestamp, value: double}
→ Пишет PySpark-скрипт с правильными типами и оптимальными настройками partition

Сценарий 3: IaC для Data Platform

DE: "Добавь в наш Terraform модуль новый S3 bucket для ML-артефактов с правильным lifecycle policy
(30 дней → Standard-IA, 90 дней → Glacier, 365 дней → delete)"

OpenCode:
→ read: terraform/modules/storage/main.tf
→ read: terraform/modules/storage/variables.tf
→ Понимает текущую структуру модуля
→ Пишет новый ресурс с lifecycle policy
→ bash: terraform validate
→ bash: terraform plan -target=aws_s3_bucket.ml_artifacts
→ "Изменения безопасны. Создаёт bucket и lifecycle rules. Готово к apply."

Сравнение с альтернативами

OpenCode Claude Code Cursor GitHub Copilot Aider
Тип Terminal Terminal IDE IDE Terminal
Open-source Частично
Model-agnostic ❌ (только Anthropic)
Локальные модели ✅ (Ollama)
MCP поддержка
LSP интеграция Частично ✅ (IDE) ✅ (IDE)
Parallel Sessions
Подходит для DE ✅✅ ✅✅

Для Data Engineer наиболее ценны terminal-native инструменты: Spark CLI, Airflow CLI, kubectl, terraform - всё это терминальные инструменты, которые IDE-инструменты не видят нативно.

Безопасность и локальное выполнение

Для enterprise DE-команд критично:

# Полностью локальная установка (без внешних API):
pip install opencode
ollama pull llama3.1:70b           # локальная модель
opencode config set model ollama/llama3.1:70b

# Работа на удалённом кластере через SSH:
ssh spark-master.internal
opencode  # запускается на удалённой машине, данные не покидают кластер

Это особенно важно при работе с PII-данными, финансовыми данными или в regulated environments (GDPR, HIPAA, PCI DSS).

Ограничения AI-агентов в Data Engineering

AI coding agents не заменяют понимание Spark internals - они усиливают инженера. Ключевые ограничения:

Ключевой принцип: агент - это умный ассистент с широкими знаниями, но без глубокого понимания вашего конкретного кластера, данных и бизнес-логики. Инженер задаёт направление и верифицирует результат.

Практика: первые шаги с OpenCode

Установка

# Установка через pip
pip install opencode-ai
# или через npm
npm install -g @opencode/cli

# Настройка API ключа (для Claude):
export ANTHROPIC_API_KEY="your-key-here"
# или для локальной модели:
ollama serve &
opencode config set model ollama/codellama:34b

Первый DE-сценарий: анализ Spark-лога

# Запуск OpenCode в директории проекта
cd /path/to/spark-project
opencode

# Диалог с агентом:
# > У меня упало Spark-задание. Лог находится в /tmp/spark-job.log
#   Проанализируй причину и предложи fix.

# Агент выполнит:
# 1. bash: cat /tmp/spark-job.log | grep -E "ERROR|Exception"
# 2. read: spark_jobs/failing_job.py
# 3. Анализ причины (OOM, Data Skew, Serialization error...)
# 4. Предложит конкретное исправление в коде
# 5. Запустит тесты: bash: pytest tests/ -v -k failing_job

Настройка MCP для вашего стека

// .opencode/config.json
{
  "mcp": {
    "postgres": {
      "type": "postgres",
      "connection": "postgresql://user:pass@prod-db:5432/analytics"
    },
    "github": {
      "type": "github",
      "token": "${GITHUB_TOKEN}"
    },
    "s3": {
      "type": "aws-s3",
      "region": "eu-west-1"
    }
  },
  "skills": [
    ".opencode/skills/analyze-spark-log.yaml",
    ".opencode/skills/check-airflow-dag.yaml"
  ]
}

Создание первого навыка (Skill)

# .opencode/skills/spark-optimize.yaml
name: spark-optimize
description: |
  Анализирует PySpark-код и предлагает оптимизации:
  broadcast joins, partition pruning, избавление от Python UDF.
trigger: "оптимизируй|optimize|slow spark"
steps:
  - name: read_code
    tool: read
    path: "{file}"
  - name: get_plan
    tool: bash
    command: "cd {project_root} && python3 -c \"
      from pyspark.sql import SparkSession
      spark = SparkSession.builder.master('local').getOrCreate()
      # run explain on the main query
    \""
  - name: analyze
    llm: true
    prompt: |
      Проанализируй этот PySpark-код и предложи оптимизации.
      Особое внимание: broadcast joins, partition pruning, UDF замены.
      Предоставь конкретный исправленный код.

Best Practices для DE-команд

Резюме

OpenCode - terminal-native open-source AI-агент, который устраняет контекстный разрыв между AI-ассистентом и DE-инструментами:

  • Model-agnostic: Claude, GPT-4, Llama через Ollama - выбираете под задачу и требования безопасности
  • Terminal-native: живёт рядом со Spark, Airflow, dbt, kubectl - не нужно переключаться
  • LSP: понимает код структурно, а не как текст - go-to-definition, find-references
  • MCP: подключается к GitHub, PostgreSQL, S3, Slack через единый протокол
  • Skills: повторно используемые цепочки для специфических DE-задач
  • Parallel Sessions: несколько агентов параллельно - отладка + разработка + инфраструктура

Не замена глубокого понимания Spark internals - усилитель инженера, который берёт рутину на себя.