دوز مباشرة للمحتوى الرئيسي
دروس فالذكاء الاصطناعي

خرّج ونظّم محادثات مساعد البرمجة بالذكاء الاصطناعي ديالك باستعمال Python

تعلّم كيفاش تستعمل استخراج بيانات مساعد البرمجة بالذكاء الاصطناعي باش تلقى سجلات المحادثات المحلية من Claude Code وCodex CLI وCursor وWindsurf وTrae وContinue وGemini CLI وOpenCode وCline وRoo Code وAider، ومن بعد تحوّلها لـ JSONL منظّم للنسخ الاحتياطي أو التحليل أو التدريب.

خرّج ونظّم محادثات مساعد البرمجة بالذكاء الاصطناعي ديالك باستعمال Python

شنو كيدير هاد المشروع

استخراج بيانات مساعدات البرمجة بالذكاء الاصطناعي كيجمع المحادثات المخزّنة محلياً من بزاف ديال مساعدات البرمجة، وكيكتبها فصيغة JSONL موحّدة. كيعاون فنسخ احتياطي لتاريخ الدردشة، ودير تحليلات شخصية، وتحضير بيانات الضبط الدقيق، ولا الحفاظ على المحادثات قبل ما يمسح التطبيق قاعدة البيانات المحلية ديالو.

الأداة كتكتاشف أوتوماتيكياً أماكن التخزين فـ macOS وLinux وWindows. كتقدر تقرا ملفات JSONL، وملفات جلسات JSON، ونسخ Markdown، وقواعد بيانات SQLite، وأشجار تخزين JSON متداخلة، بلا ما تحتاج لتبعيات Python من جهات خارجية.

المصادر المدعومة

المشروع كيدعم حالياً الأدوات التالية:

  • Claude Code: ملفات جلسات JSONL داخل ~/.claude/projects/.
  • Codex CLI: ملفات rollout بصيغة JSONL داخل ~/.codex/sessions/.
  • Cursor: ملفات SQLite باسم state.vscdb فالتخزين العام وتخزين مساحات العمل.
  • Windsurf: تخزين SQLite كيتحلل باستعمال تخمين تقريبي.
  • Trae: تخزين SQLite وJSONL كيتحلل باستعمال تخمين تقريبي.
  • Continue: ملفات JSON داخل ~/.continue/sessions/.
  • Gemini CLI: ملفات دردشة JSON داخل ~/.gemini/tmp/.
  • OpenCode: أشجار جلسات ورسائل وأجزاء بصيغة JSON.
  • Cline وRoo Code: مجلدات مهام JSON كيخزنها امتداد المحرر.
  • Aider: نسخ Markdown سميتها .aider.chat.history.md داخل مجلدات المشاريع.

التثبيت والإعداد

دير clone ولا حمّل المستودع، ومن بعد شغّل السكريبتات من جذر المشروع. المستخرج كيستعمل غير المكتبة القياسية ديال Python. خاص Python 3.9 ولا أحدث، ولكن كنوصيو بـ Python 3.10 ولا أحدث.

python --version

ما كايناش حاجة لبيئة افتراضية ولا لتثبيت التبعيات بالنسبة للمستخرج الأساسي. قبل الاستخراج، تأكد بلي أدوات البرمجة بالذكاء الاصطناعي المعنية تستعملات فالجهاز، باش تكون ملفات المحادثات المحلية ولا قواعد البيانات موجودة.

دير أول استخراج ديالك

باش تخدم بطريقة تفاعلية، شغّل السكريبت الرئيسي بلا معاملات. غادي يبان ليك منيو مرقّم تختار منو المصادر اللي بغيتي تستخرج.

python extract.py

باش تستخرج جميع المصادر المدعومة بلا أسئلة، استعمل --all.

python extract.py --all

وتقدر حتى تختار مصادر معيّنة بلائحة مفصولة بفواصل. معرّفات المصادر مبينة فجدول المصادر ديال المستودع ولا باستعمال --list.

python extract.py --sources cursor,claude_code,aider

باش تشوف شنو التثبيتات اللي تكتاشفات بلا استخراج أي محادثات، شغّل:

python extract.py --list

الاختصار المرفق ديال shell كيدير استخراج لجميع المصادر فالأنظمة اللي كيدعمو:

./extract_all.sh

اختار مسارات الإخراج والبحث

افتراضياً، ملفات JSONL مؤرخة بالوقت كتكتب فـ ./extracted_data. استعمل --output-dir باش تختار وجهة مختلفة.

python extract.py --all --output-dir ./chat-backup

معظم الأدوات عندها مجلدات معروفة ديال بيانات التطبيق، وداكشي علاش المستخرج كيقلب أوتوماتيكياً فالمواقع الشائعة ديال أنظمة التشغيل. Aider مختلف: كيخزن نسخة Markdown وحدة داخل كل مجلد مشروع بلا ما يستعمل مجلد مركزي ديال بيانات التطبيق.

استعمل خيار واحد ولا أكثر من --search-path ملي كتكون المشاريع ديالك ولا بيانات التطبيق خارج المواقع المعتادة.

python extract.py --sources aider \
  --search-path ~/client-work \
  --search-path /mnt/data/repos

مسارات البحث الإضافية مفيدة حتى فالتثبيتات غير القياسية ديال الأدوات المدعومة الأخرى.

دمج المحادثات فملف واحد

كل مصدر مختار كيتعطى عادة ملف إخراج خاص بيه ومؤرخ بالوقت. زيد --merge باش تجمع حتى جميع المحادثات المستخرجة فـ all_conversations.jsonl.

python extract.py --all --merge

مجلد إخراج نموذجي يقدر يحتوي على ملفات بحال:

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

فهم الصيغة الموحّدة

كل سطر فملف الإخراج كيمثل محادثة وحدة. البنية المشتركة فيها مصفوفة messages، ومعرّف source، وsession_id. الحقول الأخرى كتختلف حسب شنو سجّلَت الأداة الأصلية.

{
  "messages": [
    {
      "role": "user",
      "content": "How do I fix this TypeScript error?",
      "code_context": [
        {
          "file": "/Users/you/project/index.ts",
          "code": "const x: string = 123;"
        }
      ],
      "timestamp": "2026-01-16T14:30:22Z"
    },
    {
      "role": "assistant",
      "content": "The error occurs because a number is assigned to a string type.",
      "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": "TypeScript Type Error Fix",
  "created_at": 1705414222000
}

حقول بحال code_context، واستعمال التوكنات، ومسارات المشاريع، والطوابع الزمنية، واستدعاءات الأدوات، والفروقات كتكون مضمّنة ملي كيخزنها المصدر. الحقول اللي تقدر تعتمد عليها دائماً هي messages، وsource، وsession_id.

كيفاش كيخدم الاستخراج

  1. البرنامج كيتعرّف على نظام التشغيل وكيبني لائحة ديال الجذور المحتملة للبيانات، بما فيها مواقع بحال Application Support و.config و.local/share و%APPDATA% و%LOCALAPPDATA%.
  2. كل مصدر كيقلب فهاد الجذور على أسماء المجلدات والملفات المعروفة ديالو.
  3. القارئ المناسب كيحمّل التخزين بصيغة JSONL أو JSON أو SQLite أو Markdown أو JSON متداخل.
  4. المستخرج كيوحّد السجلات اللي لقاها فالبنية المشتركة ديال الرسائل.
  5. كيتكتبو ملفات JSONL مؤرخة فمجلد الإخراج.

قواعد بيانات SQLite كيتفتحو غير للقراءة، وهاد الشي كيساعد باش ما يتعطلش محرر خدام. والقرّاء معزولين حتى هوما، باش الملف الخاسر أو المقفول يعطي نتائج جزئية بلا ما يوقف الاستخراج كامل.

التعامل مع صيغ التخزين اللي ما موثّقاش

Cursor وWindsurf وTrae ما كينشروش مخططات تخزين مستقرة. مستخرج Cursor كيتعامل بشكل صريح مع بزاف ديال الأشكال المعروفة، منها محادثات ItemTable ديال مساحات العمل، ومعطيات المحرر المضمنة، ومعطيات المحرر المقسمة باستعمال bubbleId.

Windsurf وTrae كيستعملو تخمين عام فـextractors/common.py. كيقلب على المفاتيح المرتبطة بالمحادثات وكيجول فـJSON المحلّل بحثاً على كائنات كتشبه أزواج ديال الرسائل فيها الدور والنص. هاد العملية مقصودة تكون بأفضل جهد ممكن. إلا بدّل تحديث مستقبلي للتطبيق شكل التخزين، يمكن تحتاج قيم KEY_HINTS المعنية للتحديث.

استعمال الإخراج فبيانات التدريب

ملفات JSONL الموحّدة يمكن تحميلها باستعمال مكتبة datasets ديال Hugging Face. المثال التالي كيحمّل جميع الملفات المستخرجة، وكيحتافظ بالمحادثات اللي فيها رسائل المساعد، وكيهيّأها باستعمال قالب المحادثة ديال واحد الـ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)

عاين السجلات وحوّلها أكثر حسب المتطلبات ديال النموذج ديالك. المصادر المختلفة تقدر تحتوي على حقول اختيارية مختلفة، لذلك خاص مسارات التدريب تعتمد بالأساس على البنية المشتركة ديال الرسائل.

توسيع المستخرج بمصدر جديد

كل مستخرج ديال مصدر كيتبع واجهة صغيرة فيها جوج ديال الدوال. نسخ continue_ext.py كيعطيك نقطة انطلاق بسيطة.

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."""

من بعد ما تنشئ الموديول، سجّلو فلائحة REGISTRY فـextract.py. القرّاء المشتركون والتخمينات العامة متوفرين فـextractors/common.py.

حماية معطيات المحادثات الحساسة

سجلات المحادثات المحلية تقدر تحتوي على مفاتيح API، وكود ملكي، ومسارات شخصية، ومعلومات الزبناء، ومدخلات الأدوات. راجع الملفات المستخرجة قبل ما تشاركها أو تستعملها فالتدريب.

  1. قلّب فالإخراج على الأسرار.
  2. راجع حقول code_context وtool_use بعناية.
  3. ما تديرش extracted_data/ فمستودع عمومي.
  4. خلي النسخ الاحتياطية الحساسة فخزين مشفّر.
pip install detect-secrets --break-system-packages
detect-secrets scan extracted_data/*.jsonl

المشروع داخل extracted_data/ فـ.gitignore، ولكن خاصك مع ذلك تتأكد من ممارسات المستودع والنسخ الاحتياطي ديالك قبل ما تنشر أي حاجة.

حل المشاكل

ما لقا حتى تثبيت

يمكن الأداة ما تكونش مثبتة، أو ما يكون حتى تاريخ محفوظ للمحادثات، أو تكون كتستعمل موقع غير اعتيادي. شغّل --list أولاً، ومن بعد عطِ المجلد المعني باستعمال --search-path. وتقدر كذلك تعاين الثوابت SEARCH_DIRS أو APP_DIR_NAMES فمستخرج المصدر.

Cursor أو Windsurf كيبلغ على قاعدة بيانات مقفولة

المستخرجات كتستعمل اتصالات SQLite للقراءة فقط، لذلك التطبيق اللي خدام عادة ما كيمنعش الاستخراج. إلا بقات الأخطاء، سدّ التطبيق وعاود شغّل الاستخراج.

Windsurf أو Trae ما كينتج حتى محادثة

تأكد أن مجلد التطبيق تلقاو باستعمال --list. إلا تلقاوه ولكن ما تستخرج حتى محادثة، عاين مفاتيح state.vscdb المعنية وزيد الأنماط المطابقة فـKEY_HINTS ديال المستخرج المناسب.

الخلاصة

AI Coding Assistant Data Extraction كيعطيك طريقة بلا تبعيات باش تحافظ على المحادثات المحلية ديال البرمجة وتوحّدها عبر بزاف ديال صيغ التخزين وأنظمة التشغيل. بدا بـpython extract.py --list، اختار المصادر اللي محتاج، راجع JSONL اللي تولّد بحثاً عن المعلومات الحساسة، ومن بعد استعمل السجلات الموحّدة فالنسخ الاحتياطي أو التحليل أو مسارات التدريب المحضّرة بعناية.

هاد الأدوات مخصصة للبيانات ديال أدوات الذكاء الاصطناعي المثبتة فالجهاز ديالك. أنت مسؤول على التوفر على الحقوق اللازمة لاستخراج البيانات، وحماية المعلومات الحساسة، والامتثال لشروط كل أداة، والبحث عن الأسرار قبل مشاركة النتائج أو التدريب عليها.