ميزات AI
طبقة AI في cMind محايدة من حيث المزود. كل ميزة تتحدث إلى واجهة محايدة من حيث المزود
(IAiClient.CompleteAsync)؛ عميل التوجيه يحل بيانات اعتماد المزود النشط ويرسلها إلى
محول الأسلاك المطابق. أنت تختار مزودًا + نموذجًا + نقطة نهاية (وإذا كان المزود يحتاجها،
مفتاحًا)؛ وكل ميزة موجودة تعمل دون تغيير بنفس البوابة والتشفير والمرونة والتدهور.
بطاريات مضمنة: يأتي نموذج LLM محلي حقيقي مدمج في التطبيق وممكّن افتراضيًا (Microsoft.ML.OnnxRuntimeGenAI، على سبيل المثال Phi-3-mini) — لذلك كل نشر لديه AI عامل بدون مفتاح API وبدون خدمة خارجية. يمكن لنشر الملصق الأبيض إزالته وتقييد المزودين الذي قد يضيفهم المستخدمون. وراء المدمج، اتصل بأي مزود خارجي.
المزودون المدعومون:
- AI محلي مدمج (
BuiltInOnnx) — نموذج GenAI ONNX داخل العملية، بدون مفتاح، مشحون + ممكّن افتراضيًا. - Anthropic (Claude — Messages API)
- OpenAI وAzure OpenAI (Chat Completions)
- Google Gemini (
generateContent) - أي نقطة نهاية متوافقة مع OpenAI، بما فيها النماذج المحلية (Ollama وLM Studio وvLLM و
llama.cpp
serverوLocalAI) والسحابات المتوافقة مع OpenAI (Kimi / Moonshot علىhttps://api.moonshot.ai/v1/، OpenRouter، Groq، Together، Mistral، DeepSeek) — جميعها عبر محول واحد متوافق مع OpenAI، يختلف فقط بعنوان URL الأساسي + النموذج + المفتاح. يوفر حوار إضافة المزود إعدادات مسبقة بنقرة واحدة (Kimi، OpenAI، OpenRouter، Groq، DeepSeek، Mistral، Ollama، LM Studio) التي تملأ عنوان URL الأساسي + نموذج نموذجي.
بالضبط مزود واحد نشط في كل مرة. يتم تخزين بيانات الاعتماد مشفرة
(AiProviderCredential aggregate + IAiProviderStore + ISecretProtector، EncryptionPurposes.AiApiKey)؛
لا يحتاج نقطة النهاية المحلية إلى مفتاح. بدون مزود نشط، كل ميزة ترجع النتيجة المعطلة والبقية من التطبيق
تعمل دون تغيير (لا يلزم مفتاح للبناء أو الاختبار أو تشغيل المنصة).
التوافقية العكسية: يتم احترام Anthropic (App:Ai:ApiKey القديم أو إعداد ai.api_key المشفر القديم)
تلقائيًا كمزود افتراضي نشط — لا يتطلب أي إجراء.
AI غير مشفر → صفحات AI تخفف من الإجراءات وتعرض لافتة بالإضافة إلى موجه لمرة واحدة لإضافة مزود في
الإعدادات → AI (AiFeatureNotice). الحالة في GET /api/ai/status ({ enabled, kind, model });
يتم إدارة المزودين (مالك فقط) عبر GET/PUT /api/ai/providers، POST /api/ai/providers/{id}/activate،
DELETE /api/ai/providers/{id}، وطلب اتصال POST /api/ai/providers/test.
افتراضي النشر مقابل مزود المستخدم الخاص به
بيانات اعتماد AI لها نطاقان:
- افتراضي النشر (يدار من قبل المالك). يقوم المالك بتكوين مزود (أو شحن واحد عبر
App:Ai:Providers[]/App:Ai:ApiKeyالقديم). يصبح المشترك الافتراضي لكل مستخدم — حتى يتمكن الوسيط أو مزود الاستضافة من تمويل AI لكل مستخدميهم بـ لا إعداد لكل مستخدم ولا حد لكل مستخدم. يتم إدارتها عبر مسارات/api/ai/providersالمذكورة أعلاه فقط للمالك. - مزود المستخدم الخاص به (خدمة ذاتية). قد يضيف أي مستخدم مسجل دخول مزودهم الخاص تحت
GET/PUT /api/ai/my-providers،POST /api/ai/my-providers/{id}/activate،DELETE /api/ai/my-providers/{id}. عند وجودها، مزودهم النشط الخاص بهم يتجاوز افتراضي النشر لميزات AI الخاصة بهم؛ إزالتها تعود إلى الافتراضي.
ترتيب القرار (في AiProviderStore، لكل مستخدم طلب): بيانات اعتماد المستخدم النشطة الخاصة به → الافتراضي للنشر → مفتاح الإعداد القديم → بلا (AI معطل). بالضبط واحد من بيانات الاعتماد نشطة
لكل نطاق (فهرس فريد جزئي لكل OwnerUserId)، وكل نطاق يتم حله بشكل مستقل، حتى يقوم المستخدم بتفعيل مفتاحهم الخاص
لا يزعج أبدًا الافتراضي المشترك. السياقات الخلفية وغير الويب (لا توجد مستخدم طلب) تحل دائمًا الافتراضي للنشر.
مصفوفة قدرات المزود
الميزات الافتراضية لكل مزود والمالك يمكنه الكتابة فوقها. عندما تكون الميزة قبالة الميزة تتدهور، لا تطرح أبدًا: يتم إسقاط البحث على الويب بصمت؛ الرؤية ترجع فشلًا مكتوبًا.
| المزود | النوع | عنوان URL الافتراضي | مفتاح مطلوب | بحث الويب | الرؤية | ملاحظات |
|---|---|---|---|---|---|---|
| AI محلي مدمج | BuiltInOnnx | n/a (في العملية) | لا | ✖ | ✖ | نموذج ONNX GenAI مشحون، ممكّن افتراضيًا |
| Anthropic | Anthropic | https://api.anthropic.com/ | نعم | ✅ | ✅ | Messages API، web_search tool |
| OpenAI | OpenAiCompatible | https://api.openai.com/v1/ | نعم | اختياري | اختياري | Chat Completions |
| Azure OpenAI | AzureOpenAi | https://<resource>.openai.azure.com/ | نعم | ✅ | ✅ | مسار النشر + api-version |
| Google Gemini | Gemini | https://generativelanguage.googleapis.com/ | نعم | ✅ | ✅ | generateContent، google_search grounding |
| Ollama (محلي) | OpenAiCompatible | http://localhost:11434/v1/ | لا | ✖ | يعتمد على النموذج | عبر محول متوافق مع OpenAI |
| LM Studio (محلي) | OpenAiCompatible | http://localhost:1234/v1/ | لا | يعتمد على النموذج | يعتمد على النموذج | عبر محول متوافق مع OpenAI |
| vLLM / llama.cpp / LocalAI | OpenAiCompatible | عنوان URL المقدم الخاص بك | لا | ✖ | يعتمد على النموذج | عبر محول متوافق مع OpenAI |
| OpenRouter / Groq / Together / Mistral / DeepSeek | OpenAiCompatible | عنوان URL المزود | نعم | ✖ | يعتمد على النموذج | عبر محول متوافق مع OpenAI |
أدلة الإعداد الكاملة لكل مزود (المفاتيح وعناوين URL ومعرفات النماذج وخطوات واجهة المستخدم): انظر مزودي AI — كتالوج الإعداد.
AI محلي مدمج (مشحون، ممكّن افتراضيًا)
cMind يشحن نموذج LLM محلي حقيقي يعمل داخل العملية عبر Microsoft.ML.OnnxRuntimeGenAI (نموذج تعليمات مضغوط مثل Phi-3-mini). لا يحتاج إلى مفتاح API وبدون خدمة خارجية، وعند بدء التشغيل الأول — عندما لا يتم تكوين أي مزود وتسمح بوابة الملصق الأبيض به — يتم البذر والتفعيل تلقائيًا، لذلك كل نشر لديه AI عامل من الصندوق.
- يتم تكوين دليل النموذج (
genai_config.json+ tokenizer + الأوزان) بواسطةApp:Ai:BuiltIn:ModelPath(الافتراضيmodels/onnx، نسبة إلى دليل قاعدة التطبيق). عندما تكون ملفات النموذج غائبة المزود يتدهور إلى فشل مكتوب مع تلميح تثبيت — إنه لا يطرح أبدًا، والبقية من التطبيق غير متأثرة. - إنه يشغل كل ميزة نصية في AI. كونه نموذجًا مضغوطًا، يكون نصيًا فقط (بدون بحث ويب من جانب الخادم أو رؤية) وإنشاء المحتوى متسلسل (مثيل نموذج واحد، معاد استخدامه بعد تحميل كسول).
- يمكن لعدة نماذج مدمجة أن توجد معًا. كل نموذج تم تنزيله يعيش تحت
ModelPath/<key>؛ يمكن تنزيل كتالوج منسق (Phi-3.5-mini افتراضي بالإضافة إلى Phi-3-mini-128k) والتبديل من الإعدادات → AI. يؤدي اختيار نموذج فرعي مدمج إلى تحميله داخل العملية. احصل على/احزم النموذج: انظر مزودي AI → مدمج.
عناصر تحكم الملصق الأبيض
نشر الملصق الأبيض يقيد AI عبر App:Branding (يتم فرضها من جانب الخادم في كل إرسال مزود):
AllowBuiltInAi(الافتراضيtrue) — اضبط علىfalseلـ إزالة النموذج المدمج بالكامل.AllowLocalProviders(الافتراضيtrue) — اضبط علىfalseلحظر نقاط النهاية المحلية/المستضافة ذاتيًا (التكرار البطيء / OpenAI الخاص متوافق، على سبيل المثال Ollama/LM Studio/vLLM).AllowedAiProviderKinds(الافتراضي فارغ = الكل) — قائمة فقط الأنواع التي يعتمدها النشر (على سبيل المثال["Anthropic","OpenAiCompatible"]) لتأمين المزودين الذين قد يضيفهم المستخدمون.AllowAiModelManagement(الافتراضيtrue) — اضبط علىfalseلإخفاء تصفح النموذج، ومحدد النموذج لكل صفحة، وربط النموذج لكل ميزة. كلاهما قابل للتعديل من قبل المالك في وقت التشغيل من الإعدادات → النشر (مغطى مباشرة علىIOptionsMonitor) وموصوف فيWhiteLabelCatalog.
الإضافة: نماذج مدمجة مستقبلية
طبقة AI مبنية على محول وبناءً للنمو. كل مزود هو IAiProvider محدد بواسطة
AiProviderKind؛ الواجهة المواجهة للميزة (IAiClient/AiFeatureService) لا تتغير أبدًا. إضافة محرك
نموذج مدمج جديد لاحقًا (نموذج ONNX آخر، محرك داخلي مختلف، GGUF/llama.cpp
في المكان، إلخ.) هي تغيير محلي: أضف AiProviderKind، ينفذ واحد IAiProvider محول،
سجله، واختياريًا سلك البذر الافتراضي + خيار الحوار — لا توجد ميزة أو نقطة نهاية أو تغييرات أداة MCP. مزود ONNX المدمج
هو تنفيذ المرجع لهذا النمط.
القدرات
- بناء cBot — ورشة عمل قائمة على المشروع في
/ai/build: إنشاء cBot جديد (اسم فريد + لغة) أو تحسين واحد موجود يحتوي على مصدر، ثم الدردشة مع نموذج على/ai/build/{projectId}لكتابة وتحسين الكود. يتم الاحتفاظ بكل موجه وردة نموذج مع الطوابع الزمنية والبقاء على حاله عند التنقل/إعادة التحميل؛ يتم تطبيق مصدر النموذج على المشروع في كل دور. البناء والتشغيل من cBot من نفس الصفحة (أو فتحه في محرر كامل). يظهر كل مشروع في القائمة مع وقت آخر تغيير وعناصر تحكم العرض/الحذف. - محدد النموذج لكل صفحة — كل صفحة ميزة AI وحوار يعرض محدد نموذج يسرد النماذج التي قد تستخدمها (مزودوك الخاصون + الافتراضيات النشر). يختار مسبقًا ربط الميزة المحفوظ إن وُجد، وإلا النموذج الافتراضي، والنموذج الذي تختاره ينطبق على هذا الإجراء الواحد (مرسول كـ
?modelId=ومفروض بواسطةRoutingAiClientلتلك المكالمة). مخفي عندما يعطل النشر إدارة النموذج. - تصفح واختر نماذج لكل ميزة — تصفح النماذج التي تعلن عنها نقطة نهاية المزود (
GET /v1/modelsعلى LM Studio / Ollama / vLLM / llama.cpp، أو الكتالوج المدمج) بدلاً من الكتابة اليدوية لمعرّف، وربط كل ميزة AI بنموذج مختلف بحيث يخدم عدة نماذج ميزات مختلفة في وقت واحد (تسقط ميزة غير مرتبطة إلى مزود النطاق الافتراضي). - تحسين المعاملات — حلقة مغلقة: AI يقترح مجموعات المعاملات، كل واحد ثابت + backtested عبر العقد (
optimize-run/optimize-params). - عامل محفظة مستقل — اقتراحات تابعة للتفويض مع دليل القرار الكامل (
AgentMandate→AgentProposal). - حارس المخاطر العامل —
AiRiskGuardخدمة خلفية تقيّم الروبوتات قيد التشغيل، يمكن إيقاف تلقائي على المخاطر الحرجة (الاختيار). - حارس التعرض لشركة الملكية — حدود السحب/التعرض مع تسطيح تلقائي.
- تنبيهات السوق — محرك
AlertRuleمع حساسية AI (البحث على الويب مقيد حيث يدعمه المزود). - تحليل — مراجعة cBot وتحليل backtest والتشريح وحساسية السوق وتصميم الرؤية والرسم البياني وتنسيق Marketplace.
الأسطح
- نقاط نهاية الويب تحت
/api/ai/*(دردشة البناءbuild/{id}/prompt+build/{id}/messages، generate-project، review، analyze-backtest، optimize-params، optimize-run، post-mortem، sentiment، vision، curate، …). كل نقطة نهاية ميزة تقبل اختياري?modelId=<credential>لتشغيل تلك المكالمة الواحدة على نموذج مختار. بالإضافة إلى اكتشاف النموذج (/api/ai/models/probe،/api/ai/usable-models) والربط لكل ميزة (/api/ai/feature-bindings،/api/ai/my-feature-bindings). مشاريع cBot والبناء والتشغيل تعيد استخدام نقاط نهاية المنشئ (/api/builder/projects…). - أدوات MCP (
AiTools) لعملاء AI — انظر mcp.md. اختيار المزود شفاف لعملاء MCP. - AI مجموعة الملاح — صفحة Blazor واحدة لكل ميزة: بناء cBot (
/ai/build)، مراجعة (/ai/review)، نقاش (/ai/debate)، حساسية السوق (/ai/sentiment)، فحص التعرض (/ai/exposure)، ملخص المحفظة (/ai/digest)، مستشار الضبط (/ai/tune)، التحسين (/ai/optimize)، بالإضافة إلى وكيل المحفظة والتنبيهات ومفاتيح MCP. الصفحات تشاركAiFeaturePageBase+AiOutputPanel+AiModelSelect؛ كل واحد يعرضAiFeatureNoticeعندما لا يتم تكوين أي مزود. - الإعدادات → AI (
/settings/ai، مالك فقط) — قائمة المزودين مع إضافة / تحرير حوار المزود (نوع وعنوان URL الأساسي مع تلميحات لكل نوع وإعدادات مسبقة بنقرة واحدة بما فيها Kimi/Moonshot، Ollama، LM Studio ونموذج ومفتاح اختياري وتبديلات القدرة و"ضبط الافتراضي") وزر اختبار الاتصال.
التشكيل
App:Ai يدعم كل من المفتاح الواحد القديم والبذر متعدد المزودين:
- القديم:
ApiKeyوModel(افتراضيclaude-opus-4-8) وBaseUrlوMaxTokens— لا يزالان محترم كمزود Anthropic الافتراضي. - متعدد المزودين:
ActiveProvider(النوع) وProviders[]({ Kind, BaseUrl, Model, ApiKey?, MaxTokens?, Capabilities? }) — مستورد في المتجر عند بدء التشغيل إذا لم تكن هناك بيانات اعتماد حتى الآن، لذلك فريق Ops يمكنه شحن نشر مكوّن (بما فيه LLM محلي) بحتة عبر appsettings/env.
RiskGuardEnabled وRiskGuardAutoStop وRiskGuardInterval دون تغيير. للاختبارات/dev، يعيش مفتاح الإعداد
في ملف بيانات الاعتماد الموحدة تحت Ai.
موثوقية
يتم التعامل مع المزود على أنه غير موثوق — لا شيء يمكنه أن يسقط التطبيق. ينطبق هذا بشكل متطابق للسحابة وعقد النهاية المحلية (Ollama ميت يعاد محاولة ثم يتدهور تمامًا مثل Anthropic المخنوق):
- التدهور الرشيق. كل وضع فشل (لا مزود وHTTP 4xx/5xx/429 وTimeout والجسم المشوه و
المحتوى الفارغ والقدرة غير المدعومة) يعيد نوع
AiResult.Fail(reason)— العميل لا يطرح أبدًا في صفحة أو أداة MCP أو خدمة مستضافة. - خط أنابيب المرونة.
AddAiHttpClientيعطي AI المشترك الواحدHttpClientإعادة محدودة على 5xx و network failures (exponential backoff + jitter) بالإضافة إلى timeouts سخية (AiHttp)، معاد استخدامه بواسطة كل محول.
الاختبار مع LLM محاكي محلي
تُثبت طبقة AI من النهاية إلى النهاية دون أي اعتماد خارجي بواسطة FakeLocalLlmServer — نقطة نهاية صغيرة
داخل العملية متوافقة مع OpenAI ترجع ردًا محددًا مُعاد، سلك متطابق لـ Ollama/LM Studio/vLLM. يعود:
- الوحدة — لكل محول ترجمة الطلب + اختبارات تحليل الاستجابة وتوجيه/تدهور القدرة.
- التكامل — محول متوافق مع OpenAI من النهاية إلى النهاية والنظرية المرنة الموحاة عبر كل محول وأدوات MCP.
- E2E —
AiLocalFixtureيأخذ التطبيق موجهًا إلى الخادم المزيف (أو مزود حقيقي عندما يضع المطورAI_E2E_BASEURL(+ اختياريAI_E2E_API_KEY/AI_E2E_KIND/AI_E2E_MODEL) — بيانات اعتماد حقيقية تفوز) ويقود كل ميزة AI عبر واجهة المستخدم الحقيقية. إضافة أو تغيير أي ميزة AI يتطلب اختبار E2E عبر هذا الجهاز (انظر تفويض اختبار الريبو). حارة اختيارية (AI_LOCAL_LLM=1) تشغيل كمال واحد حقيقي عبر Ollama Testcontainer.
AI محلي مدمج — صفر إعداد افتراضيًا
نموذج ONNX المحلي المدمج يعمل من الصندوق: عندما يكون دليل النموذج الخاص به غائبًا و
App:Ai:BuiltIn:AutoDownload هو true (الافتراضي)، يقوم التطبيق بتنزيل النموذج مرة واحدة في
الخلفية من App:Ai:BuiltIn:DownloadBaseUrl. أثناء تشغيل التنزيل، استدعاءات AI (واختبار
الاتصال في الإعدادات → AI) ترجع رسالة واضحة "جاري تنزيل النموذج (الإعداد لأول مرة)" بدلاً من
فشل صعب. تعيين نشرات معدودة/مقسومة الإعدادات AutoDownload=false و
توفير مسبقًا دليل النموذج (App:Ai:BuiltIn:ModelPath). بوابة الملصق الأبيض
App:Branding:AllowBuiltInAi لا تزال تنطبق.
يتم أيضًا تسخين التنزيل مسبقًا عند بدء التشغيل عندما يكون النموذج المدمج هو المزود النشط، لذلك يكون
جاهزًا قبل النقر الأول لـ AI بدلاً من فشل هذا النقر برسالة "جاري التنزيل…". الإعدادات → AI
تعرض حالة التثبيت المباشرة على بطاقة المزود المدمج — جاهز النموذج / جاري تنزيل النموذج… /
النموذج غير مثبت / فشل التنزيل — مع زر تنزيل النموذج (أو إعادة محاولة التنزيل) الذي
يبدأ جلب الخلفية لمرة واحدة عند الطلب (GET /api/ai/built-in/status، POST /api/ai/built-in/install).
تفعيل المزود المدمج من الإعدادات يعيد استخدام الصف المُبذور بالفعل بدلاً من إضافة نسخة مكررة،
لذا لا يتعارض أبدًا في قيد المزود النشط الوحيد.