متوسط
⏱ ٣٥ دقيقة قراءة
© بوابة الذكاء الاصطناعي ٢٠٢٦-٠٦-٠٢
تصميم بوابة LLM متعددة المزودين في Next.js باستخدام معالجات مسار App Router للتبديل الديناميكي بين طلبات الإنتاج بين معماريات OpenAI وAnthropic مع الحفاظ على سياق الحالة.
المتطلبات الأساسية
- Node.js ١٨.x أو أعلى
- Next.js ١٤.x أو ١٥.x (هيكل App Router)
- مفاتيح API صالحة تم تكوينها في وحدات تحكم المطورين لـ OpenAI وAnthropic
- الإلمام بحمولات API متعددة الأشكال وتكوين حالة React
ما الذي نبنيه
غالبًا ما تتطلب هندسة الذكاء الاصطناعي في الإنتاج تكرار النماذج أو التوجيه المتخصص — توجيه المهام الإبداعية إلى Claude والتحديثات الهيكلية الصارمة إلى GPT. في هذا الدليل، نبني طبقة تجريد API موحدة تقوم بتنظيف وتخطيط وتنفيذ المحادثات متعددة الأدوار عبر كلا النظامين بشكل نظيف.
الإعداد والتثبيت
ابدأ طبقة تطبيق Next.js نظيفة وقم بتنزيل حزم SDK الرسمية لكلا البائعين:
npx create-next-app@latest multi-provider-chat --ts --no-tailwind --app --src-dir=false
cd multi-provider-chat
npm install openai @anthropic-ai/sdk
املأ مصفوفة البيئة المحلية الخاصة بك داخل .env.local في دليل الجذر الخاص بك:
OPENAI_API_KEY=your_openai_project_secret_key
ANTHROPIC_API_KEY=your_anthropic_live_secret_key
الخطوة ١: هندسة بوابة النموذج الموحدة
قم بإنشاء معالج مسار الخادم الخاص بك في app/api/chat/route.js. نقوم بإنشاء كلا العميلين بشكل صريح وننشئ محلل تجريد للتعامل مع اختلافات التخطيط الهيكلي بين مصفوفة الخيارات الخاصة بـ OpenAI وكتل المحتوى الخاصة بـ Anthropic.
import { NextResponse } from 'next/server';
import { OpenAI } from 'openai';
import { Anthropic } from '@anthropic-ai/sdk';const openai = new OpenAI();
const anthropic = new Anthropic();export async function POST(req) {
try {
const { provider, messages } = await req.json();if (!messages || !Array.isArray(messages)) {
return NextResponse.json({ error: 'Malformed message history payload' }, { status: 400 });
}let replyText = '';if (provider === 'openai') {
const response = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: messages.map(msg => ({
role: msg.role,
content: msg.content
}))
});
replyText = response.choices[0].message.content;} else if (provider === 'anthropic') {
// Anthropic separates the 'system' message from the historical array
const systemMessage = messages.find(m => m.role === 'system')?.content || 'You are a precise assistant.';
const conversationHistory = messages.filter(m => m.role !== 'system');const response = await anthropic.messages.create({
model: 'claude-3-5-haiku-20241022',
max_tokens: 1024,
system: systemMessage,
messages: conversationHistory.map(msg => ({
role: msg.role === 'assistant' ? 'assistant' : 'user', // Safe role mapping
content: msg.content
}))
...تابع القراءة
سجل دخولك مجاناً لقراءة المقال كاملاً والوصول إلى أدوات الذكاء الاصطناعي.
تسجيل الدخول / إنشاء حساب