docs: record model licenses and clarify cloud transcription
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
# مراجعة أولية للتراخيص وتدفق البيانات
|
||||||
|
|
||||||
|
**تاريخ اللقطة:** 2026-10-04
|
||||||
|
**الغرض:** جرد هندسي للنماذج المثبتة ومزوّد التفريغ الصوتي. هذه ليست موافقة قانونية أو إقرارًا بأن المنتج جاهز للبيع. أُخذت أسماء الوسوم والبصمات من `ollama list`، وفُحص النص المضمّن لكل وسم عبر `ollama show <tag> --license`.
|
||||||
|
|
||||||
|
## النماذج المحلية المثبتة
|
||||||
|
|
||||||
|
| وسم Ollama | المعرّف الظاهر محليًا | الرخصة التي أظهرها الوزن المحلي | مرجع المصدر الرسمي | ملاحظة الإصدار |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `gemma4:e2b` | `7fbdbf8f5e45` | Apache License 2.0 | [Google Gemma 4 E2B](https://huggingface.co/google/gemma-4-E2B) | راجع ترخيص Gemma 4 الخاص؛ لا تطبق عليه صفحة Gemma القديمة التي تحيل صراحةً إلى ترخيص Gemma 4. احتفظ بنص الرخصة المطابق للوزن الذي ستوزعه. |
|
||||||
|
| `ministral-3:3b` | `f04aa1c738f6` | Apache License 2.0 | [Mistral Ministral 3 3B Instruct](https://huggingface.co/mistralai/Ministral-3-3B-Instruct-2512-BF16) | يظل واجبًا فحص الوزن المحوّل/المكمّم المستخدم عند أي إعادة توزيع، مع إشعار Apache 2.0. |
|
||||||
|
| `qwen2.5:1.5b-instruct-q4_K_M` | `65ec06548149` | Apache License 2.0 | [Qwen2.5 1.5B Instruct GGUF](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF) | مرجع النموذج الرسمي يعلن Apache 2.0؛ طابق لاحقًا مصدر ملف GGUF تحديدًا مع نسخة Ollama قبل شحنه. |
|
||||||
|
| `granite-embedding:278m` | `1a37926bf842` | Apache License 2.0 | [IBM Granite Embedding 278M Multilingual](https://huggingface.co/ibm-granite/granite-embedding-278m-multilingual) | يستخدم للتضمينات المحلية؛ أرفق إشعار الرخصة إن أُعيد توزيع الوزن. |
|
||||||
|
| `gemma3:1b` | `8648f39daa8f` | Gemma Terms of Use، وليس Apache 2.0 | [Google Gemma 3 1B](https://huggingface.co/google/gemma-3-1b-it) و[شروط Gemma](https://ai.google.dev/gemma/terms) | هذا الوسم موجود ضمن النماذج القابلة للاختيار في Ollama. شروط Gemma تفرض قيود استخدام وإشعارًا وشروطًا لاحقة عند إعادة التوزيع؛ لا تدرج الوزن في حزمة تجارية قبل معالجة تلك الشروط أو استبعاده من قائمة النسخة التجارية. |
|
||||||
|
|
||||||
|
الأحجام الظاهرة محليًا عند الجرد: Gemma 4 E2B 7.2GB، Ministral 3:3b 3.0GB، Qwen2.5 986MB، Granite Embedding 562MB، وGemma 3 1B 815MB. هذه أحجام artifacts المكمّمة محليًا، وليست أحجام الملفات أو الإصدارات الأصلية في بطاقات النماذج.
|
||||||
|
|
||||||
|
## خدمة الصوت الخارجية
|
||||||
|
|
||||||
|
التفريغ الحالي يرسل الملف الصوتي إلى Groq عبر `audio/transcriptions`؛ هذا مسار خارجي وليس تشغيلًا محليًا. اتفاقية Groq الحالية تسمح بإدماج API في تطبيق العميل وفق الحساب والشروط، وتقول إن بيانات الإدخال والإخراج لا تستخدم لتدريب النماذج إلا بإذن صريح. توثيق البيانات يقول إن طلبات inference لا تُحفظ افتراضيًا، مع احتمال تسجيل مؤقت لأغراض الاعتمادية أو مكافحة إساءة الاستخدام لمدة تصل إلى 30 يومًا؛ تخزين البيانات يكون في Google Cloud داخل الولايات المتحدة، ويمكن للمؤسسة تفعيل Zero Data Retention من لوحة التحكم. يجب إظهار الإفصاح للمستخدم قبل الإرسال، وعدم وضع مفتاح Groq داخل تطبيق عميل موزّع.
|
||||||
|
|
||||||
|
- [Groq Services Agreement](https://console.groq.com/docs/legal/services-agreement)
|
||||||
|
- [Groq: Your Data in GroqCloud](https://console.groq.com/docs/your-data)
|
||||||
|
- [Groq Speech to Text](https://console.groq.com/docs/speech-to-text)
|
||||||
|
|
||||||
|
## ما لم يُراجع بعد قبل التوزيع
|
||||||
|
|
||||||
|
- مطابقة مصدر كل artifact محلي وبصمته وملف الرخصة المطابق له، ثم إعداد حزمة إشعارات الرخصة للنماذج التي ستُوزع فعلًا.
|
||||||
|
- مراجعة شاملة لاعتماديات Python وFlutter وWindows، وإنتاج SBOM وإشعاراتها.
|
||||||
|
- رخصة PDFium وإشعارها، ورخصة كل وزن OCR محلي مستخدم فعليًا، بما في ذلك ملفات EasyOCR العربية والإنجليزية.
|
||||||
|
- شروط Groq التجارية والخصوصية والإفصاح والموافقة، وحماية الخادم لمفتاح الخدمة؛ الاعتماد على Groq لا يحقق السيادة الرقمية للصوت.
|
||||||
|
- إيقاف إتاحة `gemma3:1b` في نسخة التوزيع إذا لم تستوفِ شروط Gemma اللاحقة. لا تغيّر هذه المذكرة اختيار المستخدم في نسخة التطوير الحالية.
|
||||||
|
- مراجعة قانونية محلية قبل إصدار تجاري، خصوصًا شروط الخدمة والخصوصية وحماية المستهلك والملكية الفكرية في أسواق التوزيع المستهدفة.
|
||||||
|
|
||||||
|
## نتائج القراءة
|
||||||
|
|
||||||
|
1. أربعة أوزان محلية من القائمة الحالية أظهرت Apache 2.0 في license notice الخاص بـOllama.
|
||||||
|
2. `gemma3:1b` تستخدم شروط Gemma الإضافية؛ لذلك لا يصح وصف كل نماذج التطبيق بأنها Apache أو مفتوحة بالرخصة نفسها.
|
||||||
|
3. ترخيص الوزن وحده لا يحسم تراخيص التطبيق واعتمادياته والبيانات والصوت الخارجي، ولا تُعد هذه اللقطة موافقة على توزيع إصدار بعينه.
|
||||||
@@ -160,13 +160,14 @@
|
|||||||
- الصوت: حاليًا Groq خارجي للتفريغ. Gemma 4 E2B تدعم الصوت بحسب [بطاقة النموذج](https://ai.google.dev/gemma/docs/core/model_card_4)، لكن مسار إرسال الصوت إليها/نسخ محلي لم يُنفّذ؛ Whisper محلي لاحقًا.
|
- الصوت: حاليًا Groq خارجي للتفريغ. Gemma 4 E2B تدعم الصوت بحسب [بطاقة النموذج](https://ai.google.dev/gemma/docs/core/model_card_4)، لكن مسار إرسال الصوت إليها/نسخ محلي لم يُنفّذ؛ Whisper محلي لاحقًا.
|
||||||
- [x] الصور: اختيار ورفع PNG/JPG/JPEG/WebP (حتى 3 صور) إلى `POST /v1/agent/images/analyze` محليًا. مع تثبيت `requirements-ocr.txt` يقرأ EasyOCR النص العربي/الإنجليزي ويغذي نصه والصورة معًا إلى نموذج الرؤية. تجربة اللقاء عبر FastAPI وMinistral المحلي أعادت HTTP 200 وتحليلًا لحقول الصورة؛ ترتيب صفوف RTL/LTR جمع العنوان العربي. بقي متوسط الثقة 0.625 وزمن OCR ~71 ثانية بعد تهيئة أولى ~45 ثانية على CPU. حد OCR مليونا بكسل للصورة، وتحليل الرؤية المحلي مسار رجوع عند غياب الحزمة أو الأوزان. راجع النص قبل استخدامه، وراجع ترخيص الأوزان قبل التوزيع التجاري.
|
- [x] الصور: اختيار ورفع PNG/JPG/JPEG/WebP (حتى 3 صور) إلى `POST /v1/agent/images/analyze` محليًا. مع تثبيت `requirements-ocr.txt` يقرأ EasyOCR النص العربي/الإنجليزي ويغذي نصه والصورة معًا إلى نموذج الرؤية. تجربة اللقاء عبر FastAPI وMinistral المحلي أعادت HTTP 200 وتحليلًا لحقول الصورة؛ ترتيب صفوف RTL/LTR جمع العنوان العربي. بقي متوسط الثقة 0.625 وزمن OCR ~71 ثانية بعد تهيئة أولى ~45 ثانية على CPU. حد OCR مليونا بكسل للصورة، وتحليل الرؤية المحلي مسار رجوع عند غياب الحزمة أو الأوزان. راجع النص قبل استخدامه، وراجع ترخيص الأوزان قبل التوزيع التجاري.
|
||||||
- [x] تحليل وفهرسة PDF رقمي أو ممسوح أو مختلط. يحدد الاستخراج حالة كل صفحة؛ النص الرقمي يحفظ ترتيب الصفحة، والممسوح يمر محليًا إلى OCR والرؤية. الحدود: 30 صفحة للملف، 3 صفحات ممسوحة للطلب، 2 مليون بكسل و4MB للصفحة، 8MB إجمالي صور، و8MB لملف PDF. في 2026-10-03، رفض EasyOCR الوزن المحلي `arabic.pth` لبصمة غير مطابقة؛ استُعيد الوزن الصحيح من أرشيف موجود مسبقًا مع حفظ النسخة القديمة، ثم نجح OCR محليًا والـAPI في قراءة موعد من PDF ممسوح دون تنزيل. عند التوزيع يجب إرفاق تراخيص PDFium ومراجعة تراخيص أوزان OCR.
|
- [x] تحليل وفهرسة PDF رقمي أو ممسوح أو مختلط. يحدد الاستخراج حالة كل صفحة؛ النص الرقمي يحفظ ترتيب الصفحة، والممسوح يمر محليًا إلى OCR والرؤية. الحدود: 30 صفحة للملف، 3 صفحات ممسوحة للطلب، 2 مليون بكسل و4MB للصفحة، 8MB إجمالي صور، و8MB لملف PDF. في 2026-10-03، رفض EasyOCR الوزن المحلي `arabic.pth` لبصمة غير مطابقة؛ استُعيد الوزن الصحيح من أرشيف موجود مسبقًا مع حفظ النسخة القديمة، ثم نجح OCR محليًا والـAPI في قراءة موعد من PDF ممسوح دون تنزيل. عند التوزيع يجب إرفاق تراخيص PDFium ومراجعة تراخيص أوزان OCR.
|
||||||
- تصميم الواجهة لتوضيح ما إذا عولج الملف محليًا أم أرسل إلى مزوّد خارجي.
|
- [x] توضيح التفريغ الصوتي الخارجي عند زر الميكروفون: التلميح يبين أن التسجيل سيرسل إلى Groq للتفريغ، وحالة التسجيل/الإرسال لا توهم بأن المعالجة محلية؛ اجتاز فحص الواجهة Flutter `7/7` والتحليل بلا ملاحظات (2026-10-04). لا يوجد حتى الآن بديل Whisper محلي أو موافقة استخدام تجارية لـGroq.
|
||||||
|
|
||||||
## المرحلة 7 — تقييم النماذج والتدريب
|
## المرحلة 7 — تقييم النماذج والتدريب
|
||||||
|
|
||||||
- [x] إنشاء مجموعة أولية من خمسة أسئلة عربية/برمجية مع معايير مراجعة بشرية وفحوص شكل/قيمة محدودة، ومشغّل يسجل الأجوبة ووقت كل طلب واسم أداة الوكيل في JSON. تجربة واحدة على Gemma 4 E2B وQwen 2.5 1.5B وحُفظت النتائج في `evals/results/` (2026-10-02).
|
- [x] إنشاء مجموعة أولية من خمسة أسئلة عربية/برمجية مع معايير مراجعة بشرية وفحوص شكل/قيمة محدودة، ومشغّل يسجل الأجوبة ووقت كل طلب واسم أداة الوكيل في JSON. تجربة واحدة على Gemma 4 E2B وQwen 2.5 1.5B وحُفظت النتائج في `evals/results/` (2026-10-02).
|
||||||
- تكرار التقييم مع إجابات مرجعية ومراجعين/درجات بشرية، وقياس استهلاك الذاكرة واعتماد مقارنة قابلة للتكرار. (2026-10-03: أُعيد التشغيل بمعايير أوسع: Gemma وQwen أكملتا 5/5 طلبات بلا أخطاء؛ Gemma مرّرت 9/9 فحوص شكلية، وQwen 8/9، ومتوسط الزمن 14.77 مقابل 6.25 ثانية. إجابة Qwen عن SQLite كانت غير دقيقة رغم اجتياز فحص وجود ثلاث نقاط، ما يثبت أن هذه الفحوص لا تقيس صحة المعنى. التقريرين النهائيين `evals/results/gemma4_e2b_2026-10-03_183058.json` و`evals/results/qwen2.5_1.5b-instruct-q4_K_M_2026-10-03_183140.json`. التقييمات السابقة المؤرخة `175827` و`180307` تستخدم فحوصًا أضيق. أُضيف `scripts/capture_ollama_runtime.ps1`: أظهر `/api/ps` حجم Gemma المحمّل 6,733,158,152 بايت وQwen 1,169,980,128 بايت، و`size_vram=0` لكليهما. اللقطتان `evals/results/ollama_runtime_2026-10-03_180846.json` و`...180934.json` لحظيتان وليستا peak؛ لا تربطان كل PID بالنموذج ولم تتوفر قراءة إجمالي/متاح RAM بسبب رفض CIM. لم تُسجل درجات بشرية بعد؛ تبقى مراجعة بشرية، قياس ذروة RAM/VRAM موثوق ومتكرر، وجولات إضافية للمقارنة.) الجولة السابقة كانت Gemma 8/10 بمتوسط 16.32 ثانية وQwen 5/10 بمتوسط 8.93 ثانية. أُصلحت منذها مشكلة الحساب المباشر مقابل الأداة وصيغة Qwen الرياضية؛ مشغّل التقييم يستخدم جلسة loopback مؤقتة ويلغيها.
|
- تكرار التقييم مع إجابات مرجعية ومراجعين/درجات بشرية، وقياس استهلاك الذاكرة واعتماد مقارنة قابلة للتكرار. (2026-10-03: أُعيد التشغيل بمعايير أوسع: Gemma وQwen أكملتا 5/5 طلبات بلا أخطاء؛ Gemma مرّرت 9/9 فحوص شكلية، وQwen 8/9، ومتوسط الزمن 14.77 مقابل 6.25 ثانية. إجابة Qwen عن SQLite كانت غير دقيقة رغم اجتياز فحص وجود ثلاث نقاط، ما يثبت أن هذه الفحوص لا تقيس صحة المعنى. التقريرين النهائيين `evals/results/gemma4_e2b_2026-10-03_183058.json` و`evals/results/qwen2.5_1.5b-instruct-q4_K_M_2026-10-03_183140.json`. التقييمات السابقة المؤرخة `175827` و`180307` تستخدم فحوصًا أضيق. أُضيف `scripts/capture_ollama_runtime.ps1`: أظهر `/api/ps` حجم Gemma المحمّل 6,733,158,152 بايت وQwen 1,169,980,128 بايت، و`size_vram=0` لكليهما. اللقطتان `evals/results/ollama_runtime_2026-10-03_180846.json` و`...180934.json` لحظيتان وليستا peak؛ لا تربطان كل PID بالنموذج ولم تتوفر قراءة إجمالي/متاح RAM بسبب رفض CIM. لم تُسجل درجات بشرية بعد؛ تبقى مراجعة بشرية، قياس ذروة RAM/VRAM موثوق ومتكرر، وجولات إضافية للمقارنة.) الجولة السابقة كانت Gemma 8/10 بمتوسط 16.32 ثانية وQwen 5/10 بمتوسط 8.93 ثانية. أُصلحت منذها مشكلة الحساب المباشر مقابل الأداة وصيغة Qwen الرياضية؛ مشغّل التقييم يستخدم جلسة loopback مؤقتة ويلغيها.
|
||||||
- اختيار النماذج حسب الرخصة، الجودة، اللغة، دعم الأدوات، كمية VRAM، وإمكانية التشغيل التجاري. لا نعتمد وصف «مفتوح» وحده كإثبات سماح تجاري؛ نراجع الرخصة الرسمية لكل إصدار.
|
- [x] جرد أولي لترخيص وسوم Ollama المحلية في `LICENSE_REVIEW_2026-10.md` (2026-10-04): فُحصت `ollama show --license` للأوزان الخمسة المثبتة وبطاقات المصادر الرسمية. Gemma 4 E2B وMinistral 3:3b وQwen2.5 وGranite Embedding أظهرت Apache 2.0؛ `gemma3:1b` تستخدم شروط Gemma الإضافية. وثّق الجرد أيضًا تدفق Groq الصوتي الخارجي واحتفاظ البيانات المحتمل.
|
||||||
|
- [ ] اعتماد النماذج والاعتماديات لنسخة تجارية محددة: مطابقة مصدر وبصمة كل وزن سيُشحن، حزمة SBOM وإشعارات Python/Flutter/Windows/PDFium/OCR، معالجة قيود Gemma 3 أو استبعادها، وشروط Groq وإفصاح الصوت. لا يُعد الجرد الأولي أعلاه موافقة قانونية أو جاهزية إصدار.
|
||||||
- تحسين أولي عبر prompts وRAG والأدوات؛ هذه غالبًا تعالج نقص المعرفة أو القدرة على الفعل دون تغيير أوزان النموذج.
|
- تحسين أولي عبر prompts وRAG والأدوات؛ هذه غالبًا تعالج نقص المعرفة أو القدرة على الفعل دون تغيير أوزان النموذج.
|
||||||
- عند توفر GPU مناسب: تجربة LoRA/QLoRA على بيانات مرخصة ومنقحة، ومقارنة النتائج بالمجموعة المرجعية قبل اعتماد adapter.
|
- عند توفر GPU مناسب: تجربة LoRA/QLoRA على بيانات مرخصة ومنقحة، ومقارنة النتائج بالمجموعة المرجعية قبل اعتماد adapter.
|
||||||
- تدريب نموذج أساسي من الصفر خارج نطاق العتاد الشخصي المعتاد؛ يحتاج بيانات وحوسبة وبنية تدريب كبيرة، ولا يكون خطتنا الأولى.
|
- تدريب نموذج أساسي من الصفر خارج نطاق العتاد الشخصي المعتاد؛ يحتاج بيانات وحوسبة وبنية تدريب كبيرة، ولا يكون خطتنا الأولى.
|
||||||
|
|||||||
@@ -2180,8 +2180,10 @@ class _ChatPageState extends State<ChatPage> {
|
|||||||
: () => _toggleRecording(voice),
|
: () => _toggleRecording(voice),
|
||||||
tooltip:
|
tooltip:
|
||||||
voice.status == VoiceStatus.recording
|
voice.status == VoiceStatus.recording
|
||||||
? 'إيقاف التسجيل'
|
? 'إيقاف التسجيل وإرساله إلى Groq للتفريغ'
|
||||||
: 'تسجيل صوت',
|
: voice.status == VoiceStatus.transcribing
|
||||||
|
? 'جارٍ إرسال الصوت إلى Groq لتحويله إلى نص'
|
||||||
|
: 'تسجيل صوت؛ يُرسل إلى Groq السحابي لتحويله إلى نص',
|
||||||
color:
|
color:
|
||||||
voice.status == VoiceStatus.recording
|
voice.status == VoiceStatus.recording
|
||||||
? Colors.red
|
? Colors.red
|
||||||
|
|||||||
@@ -170,6 +170,10 @@ void main() {
|
|||||||
expect(find.text('مساعدك المحلي'), findsOneWidget);
|
expect(find.text('مساعدك المحلي'), findsOneWidget);
|
||||||
expect(find.text('مشاريعي'), findsOneWidget);
|
expect(find.text('مشاريعي'), findsOneWidget);
|
||||||
expect(find.byTooltip('إضافة مشروع موجود إلى القائمة'), findsOneWidget);
|
expect(find.byTooltip('إضافة مشروع موجود إلى القائمة'), findsOneWidget);
|
||||||
|
expect(
|
||||||
|
find.byTooltip('تسجيل صوت؛ يُرسل إلى Groq السحابي لتحويله إلى نص'),
|
||||||
|
findsOneWidget,
|
||||||
|
);
|
||||||
expect(tester.takeException(), isNull);
|
expect(tester.takeException(), isNull);
|
||||||
|
|
||||||
await chatCubit.setDarkMode(true);
|
await chatCubit.setDarkMode(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user