Как вытащить всю историю переписок с ИИ из Cursor, Claude и Windsurf
Если вы активно пишете код с помощью 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.
