مرحبًا بك في الدليل الشامل للمبتدئين لاستخدام Vercel AI SDK. في عالم يشهد تحولًا سريعًا في المشهد الرقمي بفضل الذكاء الاصطناعي، لم تعد القدرة على دمج الذكاء الاصطناعي في تطبيقات الويب مجرد تخصص محدود، بل أصبحت كفاءة أساسية للمطورين المعاصرين. تم تصميم هذا الدليل لينقلك من مجرد مبتدئ فضولي إلى مطور تطبيقات ذكاء اصطناعي متمكن.
لفترة طويلة، كان سد الفجوة بين نماذج اللغة الكبيرة (LLM) القوية وواجهة الويب سهلة الاستخدام مهمة معقدة. كان على المطورين التعامل مع واجهات برمجة تطبيقات مختلفة للموفرين، وإدارة حالات معقدة، وتطبيق ميزات مثل تدفق الاستجابة يدويًا. تم إنشاء Vercel AI SDK لحل هذه المشاكل بالضبط. إنها مجموعة أدوات تعتمد على TypeScript أولاً وتوفر طبقة تجريد موحدة وأنيقة فوق تعقيدات بناء التجارب المدعومة بالذكاء الاصطناعي.
هذا ليس مجرد دليل بدء سريع. على مدار هذا البرنامج التعليمي، سنقوم ببناء روبوت دردشة ذكاء اصطناعي كامل وغني بالميزات من البداية باستخدام Next.js ونموذج Gemini من Google. سنتجاوز بكثير مثال "hello world" البسيط. ستتعلم:
- السبب: فهم أعمق للمفاهيم الأساسية وأنماط البنية المعمارية لتطبيقات الذكاء الاصطناعي الحديثة.
- الكيفية: عملية مفصلة وخطوة بخطوة لإعداد مشروعك، وكتابة منطق جانب الخادم، وبناء واجهة أمامية مصقولة وتفاعلية.
- القدرات المتقدمة: كيفية تمكين روبوت الدردشة الخاص بك باستخدام "الأدوات" للوصول إلى المعلومات في الوقت الفعلي، وكيفية تنظيم التفاعلات المعقدة متعددة الخطوات.
- ممارسات جاهزة للإنتاج: كيفية التعامل مع حالات التحميل، وإدارة الأخطاء بأناقة، وهيكلة التعليمات البرمجية الخاصة بك لتطبيق واقعي.
بنهاية هذا الدليل الشامل، لن يكون لديك فقط روبوت دردشة متقدم وعامل، بل ستمتلك أيضًا المعرفة المفاهيمية العميقة اللازمة لبناء تطبيقاتك الفريدة والقوية المدعومة بالذكاء الاصطناعي بثقة باستخدام Vercel AI SDK.
هل تريد منصة متكاملة وشاملة لفريق المطورين الخاص بك للعمل معًا بأقصى قدر من الإنتاجية؟
Apidog يلبي جميع متطلباتك، ويحل محل Postman بسعر معقول أكثر بكثير!
الفصل الأول: الأساسيات والإعداد
كل بناء عظيم يحتاج إلى أساس متين. في هذا الفصل، سنقوم بإعداد بيئة التطوير الخاصة بنا، وتثبيت الأدوات اللازمة، وترتيب مفاتيح واجهة برمجة التطبيقات (API). سنتوقف أيضًا لحظة لفهم "السبب" وراء كل خيار نتخذه.
المتطلبات الأساسية
قبل أن نكتب سطرًا واحدًا من التعليمات البرمجية، دعنا نتأكد من أن مجموعة أدواتك جاهزة.
- Node.js (الإصدار 18 أو أحدث): يعتمد Vercel AI SDK وأطر عمل JavaScript الحديثة مثل Next.js على الميزات المتاحة في الإصدارات الحديثة من Node.js. يمكنك التحقق من إصدارك بتشغيل الأمر
node -vفي الطرفية. إذا لم يكن لديك، يمكنك تنزيله من الموقع الرسمي لـ Node.js. - مفتاح Google AI API: هذا المفتاح هو تصريحك الموثق لاستخدام عائلة نماذج Gemini القوية من Google. Vercel AI SDK لا يعتمد على موفر محدد، ولكن لهذا الدليل، سنركز على Gemini.
- انتقل إلى Google AI Studio.
- قم بتسجيل الدخول باستخدام حساب Google الخاص بك.
- انقر على "Get API key" ثم "Create API key in new project".
- انسخ المفتاح الذي تم إنشاؤه واحفظه في مكان آمن في الوقت الحالي. تعامل مع هذا المفتاح ككلمة مرور؛ لا تعرضه علنًا أبدًا.
الخطوة 1: تهيئة مشروع Next.js
سنستخدم Next.js، إطار عمل React الرائد لبناء تطبيقات جاهزة للإنتاج. يتكامل نموذج App Router الخاص به بشكل مثالي مع طبيعة تطبيقات الذكاء الاصطناعي التي تركز على الخادم.
افتح الطرفية الخاصة بك ونفذ هذا الأمر لإنشاء مشروع جديد:
npx create-next-app@latest vercel-ai-tutorial
سيطالبك المثبت بعدة أسئلة. استخدم هذه الإعدادات للمتابعة بسلاسة:
- هل ترغب في استخدام TypeScript؟ نعم (TypeScript ضروري للتفاعلات الآمنة من حيث النوع مع الذكاء الاصطناعي)
- هل ترغب في استخدام ESLint؟ نعم (لجودة التعليمات البرمجية)
- هل ترغب في استخدام Tailwind CSS؟ نعم (لتنسيق واجهة المستخدم الخاصة بنا بسرعة)
- هل ترغب في استخدام مجلد
src/؟ نعم (اتفاقية شائعة لتنظيم التعليمات البرمجية) - هل ترغب في استخدام App Router؟ نعم (هذا ضروري لهذا الدليل)
- هل ترغب في تخصيص اسم الاستيراد الافتراضي المستعار؟ لا (الإعدادات الافتراضية جيدة)
بمجرد اكتمال التثبيت، انتقل إلى دليل المشروع الذي أنشأته حديثًا:
cd vercel-ai-tutorial
الخطوة 2: تثبيت Vercel AI SDK
الآن، دعنا نضيف حزم AI SDK إلى مشروعنا.
npm install ai @ai-sdk/react @ai-sdk/google zod
دعنا نفصل ما تفعله كل من هذه الحزم:
ai: هذا هو قلب SDK. يحتوي على الوظائف الأساسية، غير المرتبطة بإطار عمل معين، مثلstreamTextوgenerateObjectالتي تتعامل مع الاتصال المباشر بموفري LLM.@ai-sdk/react: توفر هذه الحزمة خطافات React (hooks) - وبالتحديدuseChat- التي تجعل بناء واجهات المستخدم التفاعلية أمرًا سهلاً. إنها تجرد تعقيدات إدارة الحالة، والتدفق (streaming)، والاتصال بواجهة برمجة التطبيقات (API).@ai-sdk/google: هذه حزمة موفر. إنها المحول المحدد الذي يسمح للحزمة الأساسيةaiبالاتصال بنماذج الذكاء الاصطناعي من Google. إذا أردت استخدام OpenAI، ستقوم بتثبيت@ai-sdk/openaiبدلاً من ذلك.zod: مكتبة قوية لتحديد وتصديق المخططات (schema). على الرغم من أنها ليست جزءًا أساسيًا من AI SDK، إلا أنها شريك لا غنى عنه لتحديد بنية البيانات للميزات المتقدمة مثل استدعاء الأدوات (Tool Calling)، مما يضمن أن مخرجات الذكاء الاصطناعي قابلة للتنبؤ وآمنة من حيث النوع.
الخطوة 3: تأمين مفتاح واجهة برمجة التطبيقات الخاص بك
لا تقم أبدًا بترميز مفتاح واجهة برمجة التطبيقات (API key) مباشرة في التعليمات البرمجية لتطبيقك. إنه يمثل خطرًا أمنيًا كبيرًا. المعيار الاحترافي هو استخدام متغيرات البيئة. يدعم Next.js هذا بشكل مدمج باستخدام ملفات .env.local.
قم بإنشاء الملف في جذر مشروعك:
touch .env.local
الآن، افتح هذا الملف الجديد وأضف مفتاح Google AI الخاص بك:
# .env.local
# هذا الملف مخصص للتطوير المحلي ويجب عدم إضافته إلى git.
GOOGLE_GENERATIVE_AI_API_KEY=YOUR_GOOGLE_AI_API_KEY
استبدل YOUR_GOOGLE_AI_API_KEY بالمفتاح الذي نسخته سابقًا. يقوم Next.js تلقائيًا بتحميل هذا الملف ويجعل المفتاح متاحًا على الخادم، وهو بالضبط حيث نحتاجه.
الفصل الثاني: بناء الهيكل الأساسي لروبوت الدردشة
مع إعداد مشروعنا، حان الوقت لبناء المكونات الأساسية لتطبيقنا: نقطة نهاية واجهة برمجة التطبيقات (API endpoint) على جانب الخادم التي تتحدث مع الذكاء الاصطناعي، وواجهة المستخدم (UI) على جانب العميل التي سيتفاعل معها المستخدمون.
بنية العميل-الخادم لتطبيق الذكاء الاصطناعي
سيحتوي روبوت الدردشة الخاص بنا على جزأين رئيسيين:
- مسار واجهة برمجة تطبيقات على جانب الخادم (
/api/chat/route.ts): هذه بيئة آمنة تعمل على خادم. وظيفتها الأساسية هي استقبال سجل الدردشة من متصفح المستخدم، إضافة مفتاح واجهة برمجة التطبيقات السري الخاص بنا، إعادة توجيه الطلب إلى خدمة Google AI، ثم تدفق الاستجابة مرة أخرى إلى المستخدم. الحفاظ على هذا المنطق على الخادم أمر بالغ الأهمية للأمان - فهو يضمن عدم تعرض مفتاح واجهة برمجة التطبيقات الخاص بنا للجمهور أبدًا. - واجهة مستخدم على جانب العميل (
page.tsx): هذا هو مكون React الذي يعمل في متصفح المستخدم. إنه مسؤول عن عرض سجل الدردشة، والتقاط إدخال المستخدم، وإرسال هذا الإدخال إلى مسار واجهة برمجة التطبيقات الخاص بنا.
هذا الفصل أساسي لبناء تطبيقات ويب آمنة وعالية الأداء.
الخطوة 4: إنشاء معالج مسار واجهة برمجة التطبيقات
دعنا ننشئ نقطة النهاية على جانب الخادم. في دليل src/app الخاص بك، أنشئ مجلدًا جديدًا باسم api، وداخل ذلك، مجلدًا آخر باسم chat. أخيرًا، أنشئ ملفًا باسم route.ts داخل مجلد chat.
المسار النهائي يجب أن يكون src/app/api/chat/route.ts.
املأ هذا الملف بالتعليمات البرمجية التالية:
// src/app/api/chat/route.ts
import { google } from '@ai-sdk/google';
import { streamText } from 'ai';
// إعداد خاص بـ Vercel للسماح بتدفق الاستجابات لمدة تصل إلى 30 ثانية
export const maxDuration = 30;
// معالج مسار واجهة برمجة التطبيقات الرئيسي
export async function POST(req: Request) {
try {
// استخراج مصفوفة `messages` من نص الطلب
const { messages } = await req.json();
// استدعاء موفر الذكاء الاصطناعي مع سجل المحادثة
const result = await streamText({
model: google('models/gemini-1.5-pro-latest'),
// توفر مصفوفة `messages` النموذج بالسياق للمحادثة
messages,
});
// الاستجابة باستجابة متدفقة
return result.toDataStreamResponse();
} catch (error) {
// من الممارسات الجيدة التعامل مع الأخطاء المحتملة
if (error instanceof Error) {
return new Response(JSON.stringify({ error: error.message }), { status: 500 });
}
return new Response(JSON.stringify({ error: 'An unknown error occurred' }), { status: 500 });
}
}
دعنا نحلل هذا الملف الهام:
export const maxDuration = 30;: هذا إعداد خاص بـ Vercel. تحتوي وظائف Serverless على مهلة افتراضية. نظرًا لأن استجابات الذكاء الاصطناعي قد تستغرق أحيانًا لحظة لبدء التوليد، فإننا نمدد المهلة إلى 30 ثانية لمنع إنهاء الطلب قبل الأوان.export async function POST(req: Request): في Next.js App Router، يؤدي تصدير دالة غير متزامنة (async function) تحمل اسم طريقة HTTP (مثلPOST) في ملفroute.tsإلى إنشاء نقطة نهاية واجهة برمجة تطبيقات (API endpoint).const { messages } = await req.json();: الواجهة الأمامية سترسل كائن JSON في طلبها، ونحن نقوم بتفكيك مصفوفةmessagesمنه. هذه المصفوفة هي السجل الكامل للمحادثة، وهو أمر ضروري لكي يقدم LLM استجابة واعية بالسياق.const result = await streamText(...): هذا هو الاستدعاء الأساسي لـ Vercel AI SDK. نقدم لهmodelالذي نريد استخدامه وسجلmessages. يتعامل SDK مع الطلب الموثق إلى Google API في الخلفية.return result.toDataStreamResponse();: هذه دالة مساعدة قوية. تأخذReadableStreamالذي يتم إرجاعه بواسطةstreamTextوتغلفه في كائنResponseمع الرؤوس والتنسيق الصحيحين، مما يجعل استهلاك التدفق بواسطة خطافات جانب العميل لدينا سهلاً للغاية.try...catch: لقد قمنا بتغليف منطقنا في كتلةtry...catchللتعامل بأناقة مع أي أخطاء محتملة أثناء استدعاء واجهة برمجة التطبيقات، وإرجاع رسالة خطأ واضحة للعميل.
الخطوة 5: صياغة واجهة المستخدم
الآن للجزء الممتع: بناء واجهة المستخدم. بفضل حزمة @ai-sdk/react، هذا بسيط بشكل مدهش. افتح ملف الصفحة الرئيسية في src/app/page.tsx واستبدل محتواه بالكامل بما يلي:
// src/app/page.tsx
'use client';
import { useChat } from '@ai-sdk/react';
import { useRef, useEffect } from 'react';
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit, isLoading, error } = useChat();
// مرجع لحاوية الرسائل القابلة للتمرير
const messagesContainerRef = useRef<HTMLDivElement>(null);
// تأثير للتمرير إلى أسفل حاوية الرسائل كلما تغيرت الرسائل
useEffect(() => {
if (messagesContainerRef.current) {
messagesContainerRef.current.scrollTop = messagesContainerRef.current.scrollHeight;
}
}, [messages]);
return (
<div className="flex flex-col h-screen bg-gray-50">
{/* حاوية الرسائل */}
<div ref={messagesContainerRef} className="flex-1 overflow-y-auto p-8 space-y-4">
{messages.map(m => (
<div
key={m.id}
className={`flex gap-3 ${m.role === 'user' ? 'justify-end' : 'justify-start'}`}
>
{/* عرض صورة المستخدم الرمزية */}
{m.role === 'user' && (
<div className="w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center text-white font-bold">U</div>
)}
{/* فقاعة الرسالة */}
<div
className={`max-w-xl p-3 rounded-2xl shadow-md whitespace-pre-wrap ${
m.role === 'user'
? 'bg-blue-500 text-white rounded-br-none'
: 'bg-white text-black rounded-bl-none'
}`}
>
<span className="font-bold block">{m.role === 'user' ? 'You' : 'AI Assistant'}</span>
{m.content}
</div>
{/* عرض صورة الذكاء الاصطناعي الرمزية */}
{m.role !== 'user' && (
<div className="w-10 h-10 rounded-full bg-gray-700 flex items-center justify-center text-white font-bold">AI</div>
)}
</div>
))}
</div>
{/* نموذج الإدخال */}
<div className="p-4 bg-white border-t">
<form onSubmit={handleSubmit} className="flex items-center gap-4 max-w-4xl mx-auto">
<input
className="flex-1 p-3 border rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500"
value={input}
placeholder="Ask me anything..."
onChange={handleInputChange}
disabled={isLoading}
/>
<button
type="submit"
className="px-6 py-3 bg-blue-500 text-white rounded-full font-semibold hover:bg-blue-600 disabled:bg-blue-300 disabled:cursor-not-allowed"
disabled={isLoading}
>
Send
</button>
</form>
{error && (
<p className="text-red-500 mt-2 text-center">{error.message}</p>
)}
</div>
</div>
);
}
هذا قدر كبير من التعليمات البرمجية، ولكن معظمه مخصص لإنشاء واجهة مستخدم مصقولة باستخدام Tailwind CSS. دعنا نركز على المنطق:
'use client';: هذا ضروري. إنه يحدد هذا المكون على أنه مكون عميل (Client Component)، مما يعني أنه سيتم تنفيذه في المتصفح ويمكنه استخدام الحالة (state) والتأثيرات (effects).const { ... } = useChat();: هذا السطر الواحد هو سحر مكتبة واجهة المستخدم الخاصة بـ AI SDK. يوفر كل الحالة والوظائف التي نحتاجها:messages: مصفوفة رسائل الدردشة، يتم تحديثها تلقائيًا.input،handleInputChange،handleSubmit: الحالة والمعالجات لنموذج الإدخال الخاص بنا.handleSubmitيقوم تلقائيًا بتجميع الرسائل واستدعاء نقطة نهاية/api/chatالخاصة بنا.isLoading: قيمة منطقية تكونtrueأثناء قيام الذكاء الاصطناعي بتوليد استجابة. نستخدم هذا لتعطيل النموذج أثناء الانتظار.error: كائن خطأ سيتم ملؤه إذا فشل استدعاء واجهة برمجة التطبيقات الخاص بنا. نعرض هذا للمستخدم.useRefوuseEffect: هذا نمط React قياسي لجعل عرض الدردشة يتمرر تلقائيًا إلى الأسفل عند إضافة رسائل جديدة، مما يضمن أن أحدث رسالة مرئية دائمًا.
الخطوة 6: تشغيل تطبيقك
لقد قمت الآن ببناء روبوت دردشة ذكاء اصطناعي كامل ومنظم بشكل جيد. دعنا نشغله!
npm run dev
انتقل إلى http://localhost:3000 في متصفحك. يجب أن تستقبلك واجهة دردشة مصقولة. اطرح سؤالاً. سترى رسالتك تظهر فورًا، وستتدفق استجابة الذكاء الاصطناعي رمزًا برمز (token by token).
الفصل الثالث: القدرات المتقدمة - منح روبوت الدردشة الخاص بك قوى خارقة
روبوت الدردشة الخاص بنا ذكي، لكن معرفته محدودة ببيانات التدريب الخاصة به. لا يمكنه الوصول إلى المعلومات الحية أو أداء إجراءات في العالم الحقيقي. في هذا الفصل، سنمنحه "أدوات" للتغلب على هذه القيود.
ما هي الأدوات؟
الأداة هي دالة تقوم بتعريفها يمكن لنموذج اللغة الكبير (LLM) اختيار تنفيذها. تصف الأداة للنموذج، وعندما يعتقد النموذج أن الأداة ضرورية للإجابة على استعلام المستخدم، سيوقف توليد النص وبدلاً من ذلك يخرج كائن "استدعاء أداة" (tool call) خاص. يقوم التعليمات البرمجية الخاصة بك بعد ذلك بتنفيذ الدالة باستخدام الوسائط التي يوفرها النموذج، ويتم إرسال النتيجة مرة أخرى إلى النموذج. يستخدم النموذج بعد ذلك هذه المعلومات الجديدة لتوليد استجابته النهائية الأكثر دقة.
دعنا نمكّن روبوت الدردشة الخاص بنا بأداتين:
- أداة للحصول على الطقس الحالي لموقع معين.
- أداة لتحويل درجات الحرارة من فهرنهايت إلى مئوي.
سيسمح هذا لروبوتنا بالإجابة على أسئلة مثل "ما هو الطقس في لندن بالمئوي؟" - وهي مهمة تتطلب خطوات متعددة وبيانات خارجية.
الخطوة 7: ترقية واجهة برمجة التطبيقات لدعم الأدوات
نحتاج إلى تعريف أدواتنا في استدعاء streamText على الخادم. افتح src/app/api/chat/route.ts وقم بتعديله ليشمل تعريف tools الجديد.
// src/app/api/chat/route.ts
import { google } from '@ai-sdk/google';
import { streamText, tool } from 'ai';
import { z } from 'zod';
export const maxDuration = 30;
export async function POST(req: Request) {
const { messages } = await req.json();
const result = await streamText({
model: google('models/gemini-1.5-pro-latest'),
messages,
// تعريف الأدوات التي يمكن للنموذج استخدامها
tools: {
getWeather: tool({
description: 'Get the current weather for a specific location. Always returns temperature in Fahrenheit.',
parameters: z.object({
location: z.string().describe('The city and state, e.g., San Francisco, CA'),
}),
execute: async ({ location }) => {
// في تطبيق حقيقي، ستقوم بالاستعلام من واجهة برمجة تطبيقات طقس حقيقية
console.log(`Fetching weather for ${location}`);
return {
temperature: Math.floor(Math.random() * (100 - 30 + 1) + 30),
high: Math.floor(Math.random() * (100 - 80 + 1) + 80),
low: Math.floor(Math.random() * (50 - 30 + 1) + 30),
conditions: ['Sunny', 'Cloudy', 'Rainy'][Math.floor(Math.random() * 3)],
};
},
}),
convertFahrenheitToCelsius: tool({
description: 'Convert a temperature from Fahrenheit to Celsius.',
parameters: z.object({
temperature: z.number().describe('The temperature in Fahrenheit'),
}),
execute: async ({ temperature }) => {
console.log(`Converting ${temperature}°F to Celsius`);
return {
celsius: Math.round((temperature - 32) * (5 / 9)),
};
},
}),
},
});
return result.toDataStreamResponse();
}
دعنا نحلل كائن tools:
- كل مفتاح (
getWeather،convertFahrenheitToCelsius) هو اسم أداتنا. description: هذا هو الجزء الأكثر أهمية للنموذج. يقرأ هذا الوصف لفهم ما تفعله الأداة ومتى يجب استخدامها. كن واضحًا ومحددًا.parameters: نستخدمzodلتعريف توقيع الدالة. هذا يخبر النموذج بالضبط ما هي الوسائط التي يحتاج إلى توفيرها.z.string().describe(...)يعطي النموذج تلميحًا حول التنسيق المتوقع.execute: هذه هي الدالة الفعلية على جانب الخادم التي تعمل عند استدعاء الأداة. هنا، نقوم بمحاكاة استدعاءات واجهة برمجة التطبيقات ببيانات عشوائية، ولكن يمكنك بسهولة استبدال هذا باستدعاءfetchلخدمة طقس حقيقية.
الخطوة 8: تمكين استدعاءات الأدوات متعددة الخطوات في واجهة المستخدم
مجرد تعريف الأدوات على الخادم ليس كافيًا. بشكل افتراضي، عندما يقوم النموذج باستدعاء أداة، تتوقف المحادثة. نحتاج إلى إخبار خطاف useChat الخاص بنا بإرسال نتيجة استدعاء الأداة تلقائيًا مرة أخرى إلى النموذج حتى يتمكن من متابعة تفكيره وصياغة إجابة نهائية.
هذا بسيط للغاية. في src/app/page.tsx، قم بتحديث تهيئة خطاف useChat:
// src/app/page.tsx
// ...
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit, isLoading, error } = useChat({
// أخبر الخطاف بإرسال نتائج الأداة تلقائيًا مرة أخرى إلى النموذج
experimental_sendExtraToolMessages: true,
});
// ... بقية المكون
}
هذا كل شيء. الخاصية experimental_sendExtraToolMessages: true تنشط تدفق استخدام الأدوات متعدد الخطوات.
الخطوة 9: واجهة مستخدم أفضل لاستدعاءات الأدوات
واجهة المستخدم الحالية لدينا تعرض فقط m.content. عندما يتم استدعاء أداة، تكون المعلومات المثيرة للاهتمام في خاصية مختلفة على كائن الرسالة. دعنا ننشئ مكونًا مخصصًا لعرض استدعاءات الأدوات بشكل جميل.
أولاً، دعنا نحدث حلقة الرسائل الرئيسية في src/app/page.tsx لعرض هذه الاستدعاءات.
// src/app/page.tsx
// ... داخل عبارة الإرجاع لمكون Chat
<div ref={messagesContainerRef} className="flex-1 overflow-y-auto p-8 space-y-4">
{messages.map(m => (
<div
key={m.id}
className={`flex gap-3 ${m.role === 'user' ? 'justify-end' : 'justify-start'}`}
>
{/* ... صور رمزية ... */}
<div
className={`max-w-xl p-3 rounded-2xl shadow-md whitespace-pre-wrap ${
m.role === 'user'
? 'bg-blue-500 text-white rounded-br-none'
: 'bg-white text-black rounded-bl-none'
}`}
>
<span className="font-bold block">{m.role === 'user' ? 'You' : 'AI Assistant'}</span>
{/* عرض استدعاءات الأدوات */}
{m.toolInvocations?.map(tool => (
<div key={tool.toolCallId} className="my-2 p-2 bg-gray-100 rounded text-sm text-gray-700">
<p className="font-semibold">Tool Call: `{tool.toolName}`</p>
<pre className="mt-1 p-1 bg-gray-200 rounded text-xs">
{JSON.stringify(tool.args, null, 2)}
</pre>
</div>
))}
{m.content}
</div>
{/* ... صور رمزية ... */}
</div>
))}
{isLoading && messages[messages.length - 1]?.role === 'assistant' && (
<div className="flex justify-start p-8 space-x-3">
<div className="w-10 h-10 rounded-full bg-gray-700 flex items-center justify-center text-white font-bold">AI</div>
<div className="p-3 rounded-2xl shadow-md bg-white">
<div className="typing-indicator">
<span></span><span></span><span></span>
</div>
</div>
</div>
)}
</div>
// ...
لقد أضفت أيضًا مؤشر كتابة بسيط يظهر بينما يفكر المساعد. ستحتاج إلى إضافة بعض CSS له. في ملف src/app/globals.css الخاص بك، أضف:
/* src/app/globals.css */
.typing-indicator span {
height: 8px;
width: 8px;
background-color: #9E9EA1;
border-radius: 50%;
display: inline-block;
animation: a 1.2s infinite ease-in-out;
}
.typing-indicator span:nth-child(1) { animation-delay: -0.4s; }
.typing-indicator span:nth-child(2) { animation-delay: -0.2s; }
@keyframes a {
0%, 60%, 100% { transform: scale(0.2); }
30% { transform: scale(1); }
}
الآن، قم بتشغيل التطبيق مرة أخرى. اسأله: "ما هو الطقس في نيويورك بالمئوي؟" سترى سلسلة رائعة من الأحداث تتكشف في واجهة المستخدم الخاصة بك:
- سيقوم النموذج أولاً باستدعاء أداة
getWeather. سترى استدعاء الأداة المعروض في واجهة المستخدم. - يتم إرسال النتيجة (درجة حرارة عشوائية بالفهرنهايت) مرة أخرى إلى النموذج.
- سيقوم النموذج، وهو يعلم أنه يحتاج إلى المئوي، باستدعاء أداة
convertFahrenheitToCelsius، باستخدام درجة الحرارة من نتيجة الأداة الأولى كمدخل له. - أخيرًا، مع درجة الحرارة بالمئوي في متناول اليد، سيولد استجابة بلغة طبيعية تجيب على سؤالك الأصلي.
هذه هي قوة بناء وكلاء الذكاء الاصطناعي (AI Agents)، وVercel AI SDK يجعل هذا التنظيم المعقد مباشرًا بشكل ملحوظ.
الفصل الرابع: إلى أين تتجه من هنا؟
لقد نجحت في بناء روبوت دردشة متقدم ومدعوم بالذكاء الاصطناعي. لقد انتقلت من لوحة فارغة إلى تطبيق غني بالميزات يمكنه تدفق الاستجابات، والتعامل مع حالات التحميل والأخطاء، والاستفادة من الأدوات للتفاعل مع البيانات الخارجية بطريقة متعددة الخطوات.
لقد قدم لك هذا الدليل أساسًا قويًا، لكنه مجرد البداية. Vercel AI SDK لديه المزيد ليقدمه. إليك بعض المسارات لاستكشافك المستمر:
- واجهة المستخدم التوليدية (Generative UI): لقد قمنا فقط بتدفق النص والبيانات. باستخدام مكونات خادم React (React Server Components)، يسمح لك AI SDK بجعل الذكاء الاصطناعي يولد ويقوم بتدفق مكونات React تفاعلية وكاملة التكوين. تخيل أن تسأل عن الطقس وتحصل على أداة طقس جميلة وتفاعلية بدلاً من مجرد نص. هذه ميزة متطورة ذات إمكانات هائلة.
- التوليد المعزز بالاسترجاع (RAG): قم ببناء روبوتات دردشة يمكنها التفكير بناءً على مستنداتك الخاصة. يمكنك إنشاء روبوت دردشة يجيب على أسئلة حول ملف PDF، أو مجموعة من ملفات Markdown، أو قاعدة المعرفة الداخلية لشركتك.
- استكشاف موفرين آخرين: البنية التي بنيناها قابلة للتعديل بشكل كبير. جرب استبدال نموذج Google بآخر من OpenAI أو Anthropic. غالبًا ما يكون الأمر بسيطًا مثل تغيير سطر واحد من التعليمات البرمجية في مسار واجهة برمجة التطبيقات الخاص بك، مما يتيح لك التجربة والعثور على أفضل نموذج لحالة الاستخدام الخاصة بك.
- ساحة لعب Vercel AI (Vercel AI Playground): ساحة لعب AI هي أداة لا تقدر بثمن لاختبار الأوامر ومقارنة مخرجات وأداء وتكلفة النماذج المختلفة جنبًا إلى جنب.
مستقبل تطوير الويب ذكي، تفاعلي، وشخصي. مع Vercel AI SDK، أنت الآن تمتلك الأدوات والمعرفة لتكون في طليعة هذه الثورة. بناء سعيد!
هل تريد منصة متكاملة وشاملة لفريق المطورين الخاص بك للعمل معًا بأقصى قدر من الإنتاجية؟
Apidog يلبي جميع متطلباتك، ويحل محل Postman بسعر معقول أكثر بكثير!
