Improve bounded agent tool orchestration

This commit is contained in:
Hamza Ayed
2026-10-03 16:46:27 +03:00
parent 65812cf3ee
commit ac8359de6f
5 changed files with 423 additions and 152 deletions
+4 -2
View File
@@ -4,7 +4,9 @@
## الحالة الحالية — 2026-10-03
- الأساس المحلي يعمل: Flutter Windows Debug ↔ FastAPI ↔ Ollama، مع سجل SQLite للمحادثات ونسخ الإجابات. Gemma 4 E2B هو الافتراضي للنصوص، وطلبات الصور وPDFات الممسوحة تتحول تلقائيًا إلى Ministral 3:3b المحلي عند توفره. أضيف عقد أدوات الوكيل وسجل تدقيق للبيانات الوصفية فقط؛ وضع الوكيل ينفذ الآن خطوة اختيار أداة واحدة ثم يعيد النتيجة إلى Gemma لصياغة الرد. توجد ثلاث مهارات محلية قابلة للاختيار مع قائمة أدوات مسموحة يتحقق منها الخادم. فهرس SQLite يدعم FTS5 وتضمينات Granite محلية اختيارية لملفات النص والكود وPDF الرقمي والممسوح والمختلط؛ PDF الممسوح يفهرس أول 3 صفحات عبر OCR الاختياري. الوكيل يسترجع المقاطع نصيًا ودلاليًا ويهمل النتائج القديمة عند تغير الملف. تجربة تضمين API حقيقية أعادت الملف المقصود أولًا في 3/3 أسئلة عربية؛ بقي توسيع التقييم على ملفات واقعية ومعايرة OCR وترتيب الأعمدة.
- تحقق تشغيل حديث: أُعيد تشغيل FastAPI على `127.0.0.1:8000` من نسخة المشروع الحالية مع Ollama وGemma 4؛ `/health` أعاد `ok`، والجلسة المحلية أكدت وضع الوكيل متعدد الخطوات وحده 3، وتجربة API حية اختارت `calculator` وأعادت `391.0` لـ17×23. بقي تطبيق Windows Debug شغّالًا، وظل ملف SQLite المحلي موجودًا في مساره. اختبارات Python الكاملة 80/80، واختبارات Flutter 15/15، و`flutter analyze` بلا ملاحظات من الجولة السابقة.
- الأساس المحلي يعمل: Flutter Windows Debug ↔ FastAPI ↔ Ollama، مع سجل SQLite للمحادثات ونسخ الإجابات. Gemma 4 E2B هو الافتراضي للنصوص، وطلبات الصور وPDFات الممسوحة تتحول تلقائيًا إلى Ministral 3:3b المحلي عند توفره. أضيف عقد أدوات الوكيل وسجل تدقيق للبيانات الوصفية فقط؛ ينفذ الوكيل حتى ثلاث خطوات أدوات مسموحة بالتتابع ثم يعيد النتائج إلى Gemma لصياغة الرد. عند طلب المستخدم البحث صراحةً في المشروع، يجلب الخادم مقتطفات المساحة المخصصة أولًا ويمررها كبيانات غير موثوقة. توجد ثلاث مهارات محلية قابلة للاختيار مع قائمة أدوات مسموحة يتحقق منها الخادم في كل خطوة. فهرس SQLite يدعم FTS5 وتضمينات Granite محلية اختيارية لملفات النص والكود وPDF الرقمي والممسوح والمختلط؛ PDF الممسوح يفهرس أول 3 صفحات عبر OCR الاختياري. الوكيل يسترجع المقاطع نصيًا ودلاليًا ويهمل النتائج القديمة عند تغير الملف. تجربة تضمين API حقيقية أعادت الملف المقصود أولًا في 3/3 أسئلة عربية؛ بقي توسيع التقييم على ملفات واقعية ومعايرة OCR وترتيب الأعمدة.
- اكتملت وظائف المحادثة الأساسية وطبقة مزوّد Ollama، بما فيها جداول Markdown القابلة للتمرير والقوائم المتداخلة ومربعات مهام GFM؛ اجتاز التطبيق تحليل Flutter و10 اختبارات واجهة وحالة.
- الوكيل يقرأ ملفات يختارها المستخدم، ويمكنه اقتراح إنشاء/تحديث ملف داخل مساحة العمل فقط. يعرض التطبيق diff ويطلب الموافقة قبل الكتابة؛ لا يخزّن الخادم الملفات ولا يشغل كودها. يبث الخادم مراحل التحقق واختيار الأداة والتنفيذ وصياغة الرد إلى واجهة Flutter.
- أضيف مسار كتابة أولي للوكيل: لا يكتب مباشرة؛ يعرض diff لمعاينة إنشاء/تحديث ملف داخل مساحة العمل، ثم يتطلب تأكيدًا صريحًا في التطبيق. الموافقة تستخدم رمزًا مؤقتًا لمرة واحدة وفحصًا لبصمة الملف لمنع تطبيق معاينة قديمة أو استبدال تعديل أحدث.
@@ -116,7 +118,7 @@
- التنفيذ يتم في مجلد المشروع المحدد، مع حفظ التغييرات في Git وإظهارها للمستخدم قبل اعتمادها.
- نبدأ بوكيل خطوة بخطوة (دورة واحدة واستدعاء أداة واحد)، ثم نرفع عدد الخطوات تدريجيًا بعد قياس الدقة والأمان.
- [x] تعريف عقد JSON موحّد للأدوات الحالية عبر `GET /v1/agent/tools`، مع بيان صلاحية كل أداة وحدودها وآثارها الجانبية، وسجل تدقيق SQLite عبر `GET /v1/agent/audit` يسجل المسار والطريقة والحالة والمدة فقط دون السؤال أو محتوى الملف. أضيف معرّف تدقيق في `X-Agent-Audit-ID`.
- [x] حلقة الوكيل الأولى عبر Ollama native tool calling: اختيار تلقائي بين إجابة مباشرة أو الحاسبة أو `search_workspace`؛ تحقق الخادم من allowlist والمدخلات ونفذ أداة واحدة ثم أعاد النتيجة إلى Gemma لصياغة الإجابة. رُبط وضع الوكيل في Flutter بـ`/v1/agent/run`، ويُظهر اسم الأداة ومراجع الملفات. تحقق API حي: اختار Gemma `search_workspace` لقراءة `app/workspace.py`، أعاد مسار الملف وشرحًا عن حدّ المساحة، وظهر `X-Agent-Audit-ID`. `flutter analyze --no-pub` بلا ملاحظات. (2026-10-01)
- [x] حلقة الوكيل عبر Ollama native tool calling: اختيار تلقائي بين إجابة مباشرة أو الحاسبة أو `search_workspace`؛ عند طلب البحث الصريح يقرأ الخادم أولًا من الجذر المخصص، ويتعامل مع المقتطفات كبيانات غير موثوقة. تحقق الخادم من قائمة الأدوات الفعلية والمدخلات وصلاحيات المهارة في كل خطوة، وينفذ حتى 3 أدوات بالتتابع ثم يعيد النتائج إلى Gemma لصياغة الإجابة. اقتراح تغيير الملف يوقف الأدوات عند معاينة diff، والكتابة ما زالت بموافقة صريحة. يعرض Flutter تسلسل الخطوات. تحقق 2026-10-03: اختبارات الوكيل 15/15، ومجموعة Python كاملة 80/80، وتحليل Flutter بلا ملاحظات واختباراته 15/15. طلب Gemma 4 الحي بحث عن `MAX_AGENT_TOOL_CALLS` في ملفات المشروع ثم أرسل القيمة إلى الحاسبة؛ أعاد 21.0 وذكر `app/main.py`. النموذج كرر بحث مساحة العمل مرة إضافية ضمن الحد الأقصى، ما يظهر فرصة لاحقة لتقليل التكرار. اقتراح الملف لم يتغير: يُرفض أي استدعاء أداة إضافي غير معروض بعد إنشاء المعاينة.
- [x] تنفيذ طلب الحاسبة الصريح بتعبير رياضي بسيط عبر المحلل المحلي المقيد، مع تطبيع `× ÷ −`؛ يمنع الاعتماد على قرار النموذج أو صيغة العامل وحدهما. اختبارات الوحدة وتجربتا API على Gemma وQwen تحققتا من الناتج واختيار الحاسبة (2026-10-02). هذا لا يضيف تنفيذ أوامر عامة.
- [x] إعادة تشغيل جلسة Flutter Windows Debug على الواجهة المعدّلة: أُعيد تشغيل التطبيق بعد التغييرات وتأكدت رسالة `Restarted application` (2026-10-02). ما زال التوزيع كمثبت مستقل مرحلة لاحقة.