Cursor、Claude、WindsurfからAIチャット履歴をすべて抽出する方法
過去1〜2年間でAIアシスタントを使って積極的にコードを書いているならディスクには数ギガバイトの隠れたコンテキストが蓄積されています。数百件の会話、デバッグセッション、生成された差分、エディット、コンテキストスニペットなどが含まれています。問題は、各ツールがこのデータをそれぞれの場所に隠していることです。CursorはSQLiteデータベースに履歴を保存し、Claude Codeは別々のJSONLセッションファイルを作成し、ContinueやGemini CLIはすべて深いシステムフォルダに保持しています。
開発者0xSeroのai-Data-Extractionリポジトリはシンプルな問題を解決します:ローカルのアシスタントデータベースをすべて見つけて解析し、クリーンなデータセットを統一されたJSONL形式でエクスポートします。
このデータを抽出する理由
主な理由は、自前のモデルのファインチューニングです。Qwen2.5-CoderやDeepSeek-Coderなどのオープンモデルを自分のスタック用にチューンする際、合成データセットでは不足することが多いです。アシスタントとの実際の会話には固有のデータが含まれています:タスクをどのように具体的に表現するか、どのエラーを修正するか、どのファイルをコンテキストに渡すか、どのエディットオプションを実際に受け入れるか。
2番目の理由はより実用的です:シンプルなバックアップとローカル検索。3ヶ月前のセッションをCursorやTraeのインターフェース内で見つけるのは難しい場合があります。特にプロジェクトがクローズされていたり移行されている場合にそうです。
スクリプトコレクションできること
このプロジェクトは小さなPythonスクリプトのコレクションです。良い詳細として:外部依存関係がありません。標準のPython 3.6+だけで、組み込みモジュールsqlite3、json、pathlib、osを使用します。
このセットは8つの人気ツールをサポートしています:
- Cursor(古いチャットバージョン、Composer v1およびv2、テーブル
cursorDiskKVを含む) - Claude CodeおよびClaude Desktop
- Windsurf
- Trae
- Continue
- OpenCode(デスクトップTauriバージョンとCLI)
- Google Gemini CLI
- Codex
スクリプトは自動的にOS(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/フォルダに保存されます。
1つのシステムコマンドで、すべてを1つのファイルにマージできます:
cat extracted_data/*.jsonl > all_conversations.jsonl
Unsloth経由でのトレーニング用の準備
エクスポート後、データセットはファインチューニングライブラリに簡単に供給できます。たとえば、Hugging Faceのdatasetsと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
エクスポート中にエディタのデータベースがロックされている場合(Cursorが開いているときのSQLiteでは一般的な状況)、スクリプトを実行する前にエディタを閉じるだけで問題ありません。
このリポジトリが役立つ人
このプロジェクトは、ローカルコードモデルのデータを収集するMLエンジニアや、エディタを切り替える場合に備えてAI作業のアーカイブを保存したい開発者に役立ちます。スクリプトコードはシンプルでオープンされているため、珍しいプラグインやカスタムVS Codeフォーク用に簡単に拡張できます。
関連プロジェクト