
Dự án này làm gì
AI Coding Assistant Data Extraction thu thập các cuộc trò chuyện được lưu cục bộ từ nhiều trợ lý lập trình và ghi chúng vào định dạng JSONL nhất quán. Công cụ hữu ích cho việc sao lưu lịch sử trò chuyện, thực hiện phân tích cá nhân, chuẩn bị dữ liệu tinh chỉnh hoặc lưu giữ cuộc trò chuyện trước khi ứng dụng xóa cơ sở dữ liệu cục bộ.
Bộ công cụ tự động phát hiện vị trí lưu trữ trên macOS, Linux và Windows. Công cụ có thể đọc tệp JSONL, tệp phiên JSON, bản ghi Markdown, cơ sở dữ liệu SQLite và các cây lưu trữ JSON lồng nhau mà không cần phụ thuộc Python bên thứ ba.
Nguồn được hỗ trợ
Hiện dự án hỗ trợ các công cụ sau:
- Claude Code: Các tệp phiên JSONL trong
~/.claude/projects/. - Codex CLI: Các tệp rollout JSONL trong
~/.codex/sessions/. - Cursor: Các tệp SQLite
state.vscdbtrong bộ nhớ lưu trữ toàn cục và không gian làm việc. - Windsurf: Bộ nhớ SQLite được phân tích bằng phương pháp phỏng đoán ở mức phù hợp nhất.
- Trae: Bộ nhớ SQLite và JSONL được phân tích bằng phương pháp phỏng đoán ở mức phù hợp nhất.
- Continue: Các tệp JSON trong
~/.continue/sessions/. - Gemini CLI: Các tệp trò chuyện JSON trong
~/.gemini/tmp/. - OpenCode: Các cây phiên, tin nhắn và phần JSON.
- Cline và Roo Code: Các thư mục tác vụ JSON được tiện ích mở rộng trình soạn thảo lưu trữ.
- Aider: Các bản ghi Markdown có tên
.aider.chat.history.mdbên trong thư mục dự án.
Cài đặt và thiết lập
Sao chép hoặc tải xuống kho lưu trữ, sau đó chạy các tập lệnh từ thư mục gốc của dự án. Trình trích xuất chỉ sử dụng thư viện chuẩn của Python. Yêu cầu Python 3.9 trở lên; khuyến nghị Python 3.10 trở lên.
python --version
Không cần môi trường ảo hoặc cài đặt phụ thuộc cho trình trích xuất cốt lõi. Trước khi trích xuất, hãy đảm bảo các công cụ lập trình AI liên quan đã được sử dụng trên máy để các tệp trò chuyện hoặc cơ sở dữ liệu cục bộ tồn tại.
Thực hiện lần trích xuất đầu tiên
Để sử dụng theo quy trình tương tác, hãy chạy tập lệnh chính mà không có đối số. Tập lệnh hiển thị menu được đánh số để bạn chọn các nguồn cần trích xuất.
python extract.py
Để trích xuất mọi nguồn được hỗ trợ mà không hiển thị lời nhắc, hãy sử dụng --all.
python extract.py --all
Bạn cũng có thể chọn các nguồn cụ thể bằng danh sách phân tách bằng dấu phẩy. ID nguồn được hiển thị trong bảng nguồn của kho lưu trữ hoặc khi sử dụng --list.
python extract.py --sources cursor,claude_code,aider
Để xem những bản cài đặt nào đã được phát hiện mà không trích xuất cuộc trò chuyện, hãy chạy:
python extract.py --list
Phím tắt shell đi kèm sẽ thực hiện trích xuất tất cả nguồn trên các hệ thống có hỗ trợ:
./extract_all.sh
Chọn đường dẫn đầu ra và tìm kiếm
Theo mặc định, các tệp JSONL có dấu thời gian được ghi vào ./extracted_data. Sử dụng --output-dir để chọn đích khác.
python extract.py --all --output-dir ./chat-backup
Hầu hết công cụ có các thư mục dữ liệu ứng dụng dễ dự đoán, nên trình trích xuất tự động tìm kiếm các vị trí phổ biến của hệ điều hành. Aider thì khác: công cụ lưu một bản ghi Markdown trong mỗi thư mục dự án thay vì sử dụng thư mục dữ liệu ứng dụng trung tâm.
Sử dụng một hoặc nhiều tùy chọn --search-path khi dự án hoặc dữ liệu ứng dụng của bạn nằm ngoài các vị trí thông thường.
python extract.py --sources aider \
--search-path ~/client-work \
--search-path /mnt/data/repos
Đường dẫn tìm kiếm bổ sung cũng hữu ích cho các bản cài đặt không theo tiêu chuẩn của những công cụ được hỗ trợ khác.
Gộp cuộc trò chuyện vào một tệp
Mỗi nguồn được chọn thường nhận một tệp đầu ra riêng có dấu thời gian. Thêm --merge để đồng thời nối tất cả cuộc trò chuyện đã trích xuất vào all_conversations.jsonl.
python extract.py --all --merge
Một thư mục đầu ra điển hình có thể chứa các tệp như:
extracted_data/
├── claude_code_conversations_20260816_143022.jsonl
├── cursor_conversations_20260816_143022.jsonl
├── aider_conversations_20260816_143022.jsonl
├── cline_conversations_20260816_143022.jsonl
└── all_conversations.jsonl
Tìm hiểu định dạng chuẩn hóa
Mỗi dòng trong tệp đầu ra đại diện cho một cuộc trò chuyện. Cấu trúc chung bao gồm mảng messages, mã định danh source và session_id. Các trường khác phụ thuộc vào thông tin mà công cụ gốc đã ghi lại.
{
"messages": [
{
"role": "user",
"content": "Tôi sửa lỗi TypeScript này như thế nào?",
"code_context": [
{
"file": "/Users/you/project/index.ts",
"code": "const x: string = 123;"
}
],
"timestamp": "2026-01-16T14:30:22Z"
},
{
"role": "assistant",
"content": "Lỗi xảy ra vì một số được gán cho kiểu chuỗi.",
"tool_use": [
{
"name": "edit_file",
"input": {"path": "src/index.ts"}
}
],
"timestamp": "2026-01-16T14:30:25Z"
}
],
"source": "cursor-composer",
"session_id": "c1a2b3...",
"project_path": "/Users/you/project",
"name": "Sửa lỗi kiểu TypeScript",
"created_at": 1705414222000
}
Các trường như code_context, mức sử dụng token, đường dẫn dự án, dấu thời gian, lệnh gọi công cụ và diff được đưa vào khi nguồn lưu trữ chúng. Các trường bạn có thể luôn tin cậy là messages, source và session_id.
Cách thức trích xuất
- Chương trình phát hiện hệ điều hành và xây dựng danh sách các thư mục gốc dữ liệu có khả năng được sử dụng, bao gồm những vị trí như
Application Support,.config,.local/share,%APPDATA%và%LOCALAPPDATA%. - Mỗi trình trích xuất tìm kiếm tên thư mục và tệp đã biết trong các thư mục gốc đó.
- Trình đọc phù hợp sẽ tải dữ liệu JSONL, JSON, SQLite, Markdown hoặc JSON lồng nhau.
- Bộ trích xuất chuẩn hóa các bản ghi được phát hiện thành lược đồ tin nhắn dùng chung.
- Các tệp JSONL có dấu thời gian được ghi vào thư mục đầu ra.
Cơ sở dữ liệu SQLite được mở ở chế độ chỉ đọc, giúp tránh chặn trình soạn thảo đang chạy. Các trình đọc cũng được cô lập để tệp bị hỏng hoặc bị khóa chỉ tạo ra kết quả một phần thay vì khiến toàn bộ quá trình trích xuất dừng lại.
Xử lý các định dạng lưu trữ chưa được tài liệu hóa
Cursor, Windsurf và Trae không công bố các lược đồ lưu trữ ổn định. Bộ trích xuất của Cursor xử lý rõ ràng một số dạng đã biết, bao gồm chat ItemTable trong workspace, dữ liệu trình soạn thảo nội tuyến và dữ liệu trình soạn thảo phân tách theo bubbleId.
Windsurf và Trae sử dụng một heuristic tổng quát trong extractors/common.py. Heuristic này tìm kiếm các khóa liên quan đến chat và duyệt qua JSON đã phân tích để tìm những đối tượng giống các cặp tin nhắn gồm vai trò và văn bản. Đây là cơ chế cố gắng tốt nhất có thể. Nếu bản cập nhật trong tương lai của ứng dụng thay đổi cấu trúc lưu trữ, có thể cần cập nhật các giá trị KEY_HINTS liên quan.
Sử dụng đầu ra cho dữ liệu huấn luyện
Các tệp JSONL đã chuẩn hóa có thể được tải bằng thư viện datasets của Hugging Face. Ví dụ sau tải tất cả các tệp đã trích xuất, giữ lại những cuộc hội thoại có tin nhắn của trợ lý và định dạng chúng bằng chat template của tokenizer.
from datasets import load_dataset
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"])
)
def format_chat(example):
return {
"text": tokenizer.apply_chat_template(
example["messages"],
tokenize=False
)
}
dataset = dataset.map(format_chat)
Kiểm tra và chuyển đổi thêm các bản ghi theo yêu cầu của mô hình. Các nguồn khác nhau có thể chứa những trường tùy chọn khác nhau, vì vậy pipeline huấn luyện nên chủ yếu dựa trên cấu trúc tin nhắn dùng chung.
Mở rộng bộ trích xuất với nguồn mới
Mỗi bộ trích xuất nguồn tuân theo một giao diện nhỏ gồm hai hàm. Sao chép continue_ext.py là cách đơn giản để bắt đầu.
DISPLAY_NAME = "My Tool"
SOURCE_ID = "my_tool"
def find_installations(extra_paths: list[Path] | None = None) -> list[Path]:
"""Return directories or files worth scanning."""
def extract(installations: list[Path]) -> list[dict]:
"""Return normalized conversation dictionaries."""
Sau khi tạo mô-đun, hãy đăng ký mô-đun đó trong danh sách REGISTRY ở extract.py. Các trình đọc dùng chung và heuristic tổng quát có sẵn trong extractors/common.py.
Bảo vệ dữ liệu hội thoại nhạy cảm
Lịch sử chat cục bộ có thể chứa khóa API, mã nguồn độc quyền, đường dẫn cá nhân, thông tin khách hàng và dữ liệu đầu vào của công cụ. Hãy xem xét các tệp đã trích xuất trước khi chia sẻ hoặc sử dụng chúng để huấn luyện.
- Quét đầu ra để tìm bí mật.
- Kiểm tra kỹ các trường
code_contextvàtool_use. - Không commit
extracted_data/vào kho lưu trữ công khai. - Lưu các bản sao lưu nhạy cảm trên bộ nhớ được mã hóa.
pip install detect-secrets --break-system-packages
detect-secrets scan extracted_data/*.jsonl
Dự án đã thêm extracted_data/ vào .gitignore, nhưng bạn vẫn nên kiểm tra kho lưu trữ và quy trình sao lưu trước khi công khai bất kỳ dữ liệu nào.
Khắc phục sự cố
Không tìm thấy bản cài đặt
Công cụ có thể chưa được cài đặt, chưa có lịch sử chat đã lưu hoặc đang sử dụng vị trí không chuẩn. Trước tiên hãy chạy --list, sau đó cung cấp thư mục liên quan bằng --search-path. Bạn cũng có thể kiểm tra các hằng số SEARCH_DIRS hoặc APP_DIR_NAMES trong bộ trích xuất nguồn.
Cursor hoặc Windsurf báo cơ sở dữ liệu bị khóa
Các bộ trích xuất sử dụng kết nối SQLite chỉ đọc, vì vậy ứng dụng đang chạy thường sẽ không chặn quá trình trích xuất. Nếu lỗi vẫn tiếp diễn, hãy đóng ứng dụng và chạy lại quá trình trích xuất.
Windsurf hoặc Trae không tạo ra cuộc hội thoại nào
Xác nhận rằng thư mục ứng dụng đã được tìm thấy bằng --list. Nếu đã tìm thấy nhưng không trích xuất được chat nào, hãy kiểm tra các khóa state.vscdb liên quan và thêm các mẫu khớp vào KEY_HINTS trong bộ trích xuất phù hợp.
Kết luận
AI Coding Assistant Data Extraction cung cấp cho bạn một cách không phụ thuộc vào thư viện bên ngoài để lưu giữ và chuẩn hóa các cuộc hội thoại lập trình cục bộ trên nhiều định dạng lưu trữ và hệ điều hành. Hãy bắt đầu bằng python extract.py --list, chọn các nguồn cần thiết, kiểm tra JSONL được tạo để tìm thông tin nhạy cảm, rồi sử dụng các bản ghi đã chuẩn hóa cho quy trình sao lưu, phân tích hoặc huấn luyện được chuẩn bị cẩn thận.
Bộ công cụ này dành cho dữ liệu từ các công cụ AI được cài đặt trên máy của chính bạn. Bạn chịu trách nhiệm bảo đảm mình có quyền trích xuất dữ liệu, bảo vệ thông tin nhạy cảm, tuân thủ điều khoản của từng công cụ và quét bí mật trước khi chia sẻ hoặc huấn luyện bằng các kết quả này.
