كيفية استخدام نقاط نهاية الذكاء الاصطناعي الداخلية؟

أتساءل عن النهج الصحيح لاستخدام نقاط نهاية واجهة برمجة التطبيقات (API) الخاصة بالذكاء الاصطناعي الداخلي (مثل LiteLLM) على مثيلات Discourse المستضافة ذاتيًا.

لقد حاولت تمكين جسر Docker (docker bridge)، وعناوين IP الخاصة بالصناديق (container IPs)، ونقاط النهاية المنتهية بـ SSL بشكل صحيح (لنفس عنوان IP العام الذي تستضيف عليه Discourse)، لكن لم ينجح أي شيء. لقد سمحت للعناوين الداخلية، لكنني أواجه خطأ 500 عند الاختبار في واجهة LLM-AI داخل Discourse.

من المرجح أن الأمر يتعلق بإعداداتي الخاصة، وأعلم أنني ربما ارتكبت بعض الأخطاء. لذا، آمل حل هذه المشكلة بمساعدة المجتمع :slight_smile:

حالتنا الأساسية هي محاولة استخدام نقاط نهاية Vertex AI (OpenAI) التي لم تعمل بشكل تلقائي على Discourse لأنها غير مدعومة. لكننا نريد أيضًا الطبقة التي يضيفها LiteLLM إلى سير عملنا.

السجلات:

FinalDestination::SSRFDetector::DisallowedIpError (FinalDestination: جميع عناوين IP التي تم حلها غير مسموح بها)

إذا كنت تقوم بتشغيله على نفس الخادم، فستحتاج إلى السماح به عبر متغير البيئة DISCOURSE_ALLOWED_INTERNAL_HOSTS.

نفذت ذلك عبر الواجهة كما رأيت في منشور سابق مشابه. حاولت أيضًا باستخدام المتغير في ملف app.yml الخاص بي، لكنني ما زلت أحصل على الخطأ.

ما الذي قد يكون خاطئًا إذا كانت بيانات الاعتماد الخاصة بي صحيحة ويمكنني استخدام نقطة نهاية واجهة برمجة التطبيقات على المضيف؟ هل يمكنني إجراء المزيد من عمليات التصحيح؟

كيف أضفته بالضبط إلى ملف app.yml؟ إنه يتوقع إما عنوان IP أو اسم مضيف.

حسنًا، لقد اختبرت نقطة النهاية (endpoint) باستخدام SSL داخل Discourse (حاوية التطبيق) وهي تعمل، لكنها لا تعمل من اختبار واجهة Discourse AI.

أستخدم مزود “OpenAI” مع عنوان URL التالي: https://llm.mydomain.tld/v1/chat/completions. بيانات الاعتماد صحيحة:

/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:182:in 'DiscourseAi::Completions::Endpoints::Base#perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai_shared.rb:28:in 'DiscourseAi::Completions::Endpoints::OpenAiShared#perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/llm.rb:214:in 'DiscourseAi::Completions::Llm#generate'

pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:46:in 'Pitchfork::SoftTimeout::Request#interrupt'
pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:94:in 'block (2 levels) in Pitchfork::SoftTimeout#create_timeout_thread'
pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:93:in 'Array#each'
pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:93:in 'block in Pitchfork::SoftTimeout#create_timeout_thread' 

الأمر غريب، وقد حاولت حل هذه المشكلة منذ أسابيع.


لقد جربت ما يلي بالفعل:

التعديل 1: DISCOURSE_ALLOWED_INTERNAL_HOSTS: 172.16.X.X (عنوان IP لحاوية LiteLLM، و 127.0.0.1، والنطاق المضيف لـ LLM الذي تم إنهاء SSL الخاص به، ولا أعتقد أنه مطلوب إضافته هنا)

التعديل 2: وأرى نفس خطأ 500 عند محاولة الدخول لتكوين خادم MCP الخاص بي (تكوين علامة تبويب discourse-ai لخادم MCP).

حاول استبدال ذلك بـ DISCOURSE_ALLOWED_INTERNAL_HOSTS: llm.mydomain.tld.

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

هذا نقطة النهاية تعمل داخل تطبيق حاوية Discourse، لكنها لا تعمل من واجهة Discourse كما هي.

تمكنت من جعل هذا يعمل عن طريق تعيين DISCOURSE_ALLOWED_INTERNAL_HOSTS: localhost كمتغير بيئي للاتصال بوحدة LiteLLM الجانبية الخاصة بي المضافة على localhost:4000. كما لدي طلب سحب لإضافة مصادقة Vertex AI هنا: DEV: add Google Vertex AI LLM provider by evantobin · Pull Request #41350 · discourse/discourse · GitHub

لقد حللت المشكلة عن طريق إضافة عنوان IP الخاص ببوابة Docker الداخلية إلى DISCOURSE_ALLOWED_INTERNAL_HOSTS وتعريض المنفذ في ملف docker-compose.yml الخاص بـ LiteLLM:

    ports:
      - "4444:4000"

يشير Nginx إلى LITELLM_IP:4000 وDiscourse إلى GATEWAY_IP:4444 لتجنب تعارض المنافذ.


ثم قمت بحل الأخطاء في واجهة إدارة MCP عن طريق إزالة أدوات MCP المضافة سابقاً والتي لم تكن تعمل:

# List all configured MCP servers
AiMcpServer.all

# If you see a bad one, delete it by ID (e.g., id: 1)
AiMcpServer.find(1).destroy

آمل أن يكون هذا مفيداً لأشخاص آخرين لديهم إعداد مشابه.