Как вытащить всю историю переписок с ИИ из Cursor, Claude и Windsurf

17 авг 2026
1,280
107
5
1 неделя

Если вы активно пишете код с помощью AI-ассистентов последние год или два, на вашем диске скопились гигабайты скрытого контекста. Это сотни диалогов, отладочных сессий, сгенерированных диффов, правок и контекстных сниппетов. Проблема в том, что каждый инструмент прячет эти данные по своим углам. Cursor складывает историю в базы SQLite, Claude Code пишет отдельные JSONL-файлы сессий, а Continue и Gemini CLI хранят всё в глубоких системных папках.

Репозиторий ai-data-extraction от разработчика 0xSero решает простую задачу: он находит все локальные базы ассистентов, парсит их и выгружает чистый датасет в едином формате JSONL.

Зачем вытаскивать эти данные

Основная причина — дообучение собственных моделей. Когда разработчики тюнят открытые модели вроде Qwen2.5-Coder или DeepSeek-Coder под свой стек, синтетических датасетов часто не хватает. Ваши реальные диалоги с ассистентом содержат уникальные данные: как именно вы формулируете задачу, какие ошибки правите, какие файлы передаете в контекст и какие варианты правок реально принимаете.

Вторая причина более приземленная: банальный бэкап и локальный поиск. Найти сессию трехмесячной давности внутри интерфейса Cursor или Trae бывает непросто, особенно если проект закрыт или перенесен.

Что умеет набор скриптов

Проект представляет собой коллекцию небольших Python-скриптов. Приятная деталь: здесь нет внешних зависимостей. Для запуска нужен только стандартный Python 3.6+, скрипты используют встроенные модули sqlite3, json, pathlib и os.

Реклама

Набор поддерживает восемь популярных инструментов:

  • Cursor (включая старые версии чата, Composer v1 и v2 с таблицами cursorDiskKV)
  • Claude Code и Claude Desktop
  • Windsurf
  • Trae
  • Continue
  • OpenCode (десктопную версию на Tauri и CLI)
  • Google Gemini CLI
  • Codex

Скрипты автоматически определяют операционную систему (macOS, Linux или Windows), находят рабочие директории редакторов и вытаскивают структурированную историю.

Как устроен выгружаемый формат

Каждая строчка в итоговом JSONL-файле — это отдельная законченная сессия. Скрипты достают не голый текст, а полный срез контекста:

{
  "messages": [
    {
      "role": "user",
      "content": "Как исправить эту ошибку типизации в TypeScript?",
      "code_context": [
        {
          "file": "/Users/user/project/src/index.ts",
          "code": "const x: string = 123;",
          "range": {
            "selectionStartLineNumber": 10,
            "positionLineNumber": 10
          }
        }
      ],
      "timestamp": "2025-01-16T14:30:22.123Z"
    },
    {
      "role": "assistant",
      "content": "Ошибка возникает из-за присвоения числа переменной строкового типа...",
      "suggested_diffs": [],
      "model": "claude-sonnet-4-5",
      "timestamp": "2025-01-16T14:30:25.456Z"
    }
  ],
  "source": "cursor-composer",
  "name": "TypeScript Type Error Fix",
  "created_at": 1705414222000
}

Внутрь попадают системные вызовы тулов, результаты выполнения команд, примененные диффы и метаданные конкретной модели.

Быстрый старт

Клонируем репозиторий и запускаем нужный скрипт:

git clone https://github.com/0xSero/ai-data-extraction.git
cd ai-data-extraction

# Выгрузить только Cursor
python3 extract_cursor.py

# Или вытащить данные сразу со всех установленных инструментов
./extract_all.sh

Все результаты упадут в папку extracted_data/ в виде отдельных файлов с таймстемпами.

Объединить всё в один общий файл можно одной системной командой:

cat extracted_data/*.jsonl > all_conversations.jsonl

Подготовка к обучению через Unsloth

После выгрузки датасет легко скормить библиотекам для файн-тюнинга. Например, связка datasets от Hugging Face и Unsloth подхватывает такой JSONL напрямую:

from datasets import load_dataset
from unsloth import FastLanguageModel

# Загружаем собранные сессии
dataset = load_dataset('json', data_files='extracted_data/*.jsonl', split='train')

# Оставляем только сессии с ответами ассистента
dataset = dataset.filter(lambda x: any(m['role'] == 'assistant' for m in x['messages']))

model, tokenizer = FastLanguageModel.from_pretrained(
    "unsloth/qwen2.5-coder-7b-instruct",
    max_seq_length=4096,
    load_in_4bit=True,
)

def format_chat(example):
    return {
        'text': tokenizer.apply_chat_template(
            example['messages'],
            tokenize=False
        )
    }

dataset = dataset.map(format_chat)

Безопасность и нюансы

Перед тем как отправлять полученный датасет в облако или на внешний сервер, проверьте его содержимое. В истории диалогов неизбежно окажутся приватные фрагменты кода, пути к домашним директориям, а иногда и забытые API-ключи.

Автор проекта рекомендует прогнать файлы через детектор секретов:

pip install detect-secrets
detect-secrets scan extracted_data/*.jsonl

Если база данных редактора в момент выгрузки заблокирована (частая ситуация с SQLite, когда Cursor открыт), просто закройте редактор перед запуском скрипта.

Кому пригодится репозиторий

Проект пригодится ML-инженерам, которые собирают данные для локальных код-моделей, и разработчикам, желающим сохранить архив своей работы с ИИ на случай смены редактора. Код скриптов простой и открытый, его легко дописать под любой редкий плагин или собственный форк VS Code.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.