المتطلبات الأساسية
قبل البدء، تأكّد من توافر ما يلي:
- Node.js 20 أو أحدث
- مشروع Next.js 15 (أو أنشئ مشروعًا جديدًا بـ
npx create-next-app@latest) - حساب على Groq Cloud ومفتاح API من
console.groq.com - معرفة أساسية بـ TypeScript وReact
ما ستبنيه
ستبني تطبيق محادثة ذكاء اصطناعي احترافي يعمل بتدفق البيانات عبر واجهة برمجة Groq مع Llama 4 Scout. في نهاية هذا الدليل ستحصل على:
- مسار API على Next.js يدفق استجابات Groq إلى المتصفح
- واجهة محادثة React بتدفق مباشر للرموز ومقاييس سرعة آنية
- دعم استدعاء الأدوات (Function Calling) مع التحقق من المدخلات
- اختيار النموذج من بين النماذج المتاحة على Groq
- معالجة قوية للأخطاء مع التراجع الأسّي
تحقق Groq سرعة تتجاوز 800 رمز في الثانية على Llama 4 Scout — أي ما يقارب 10 أضعاف سرعة معظم مزودي الاستدلال الآخرين. هذا يجعلها مثالية للتطبيقات الحساسة للكمون مثل مساعدي كتابة الكود والإجابة الفورية على الأسئلة وسير عمل الوكلاء الذكيين.
الخطوة 1: إنشاء حساب Groq
- اذهب إلى
console.groq.comوأنشئ حسابًا مجانيًا. - انتقل إلى API Keys واضغط على Create API Key.
- انسخ المفتاح — يبدأ بـ
gsk_. - أضفه إلى ملف
.env.localفي جذر مشروعك.
الطبقة المجانية تتضمن حدودًا سخية للتطوير — 30 طلبًا في الدقيقة على معظم النماذج. توفر الخطط المدفوعة حدودًا أعلى وسعة مخصصة لبيئات الإنتاج.
الخطوة 2: تثبيت Groq SDK
في مشروع Next.js الخاص بك، ثبّت حزمة Groq TypeScript الرسمية:
pnpm add groq-sdkأضف مفتاح API إلى .env.local:
GROQ_API_KEY=gsk_مفتاحك_هناالأمان: لا تكشف GROQ_API_KEY على جانب العميل أبدًا. استدعِ Groq دائمًا من مسارات API على الخادم أو Server Actions. يستثني Next.js تلقائيًا متغيرات البيئة غير المسبوقة بـ NEXT_PUBLIC_ من حزمة العميل.
الخطوة 3: تهيئة عميل Groq
أنشئ lib/groq.ts لتهيئة عميل Groq كـ singleton:
import Groq from 'groq-sdk';
export const groq = new Groq({
apiKey: process.env.GROQ_API_KEY,
});اختبر استكمالًا بسيطًا للتحقق من صحة الإعداد:
// scripts/test-groq.ts
import { groq } from '../lib/groq';
const completion = await groq.chat.completions.create({
model: 'llama-4-scout-17b-16e-instruct',
messages: [
{
role: 'user',
content: 'اشرح ما الذي يميّز Groq عن مزودي الاستدلال الآخرين في جملتين.',
},
],
max_tokens: 256,
});
console.log(completion.choices[0].message.content);
console.log('الاستخدام:', completion.usage);شغّله:
npx tsx scripts/test-groq.tsستحصل على استجابة في أقل من 500 ميلي ثانية، إلى جانب بيانات الاستخدام التي تُظهر عدد الرموز ووقت الاستدلال.
الخطوة 4: اختيار النموذج المناسب
تدعم Groq عدة نماذج مفتوحة في 2026. اختر بناءً على حالة الاستخدام:
| معرّف النموذج | السياق | الأنسب لـ |
|---|---|---|
llama-4-scout-17b-16e-instruct | 131k | محادثة سريعة، كتابة كود، إجابة أسئلة |
llama-4-maverick-17b-128e-instruct | 131k | استدلال معقد، مستندات طويلة |
llama-3.3-70b-versatile | 128k | مهام تتطلب دقة عالية |
mixtral-8x7b-32768 | 32k | توازن بين السرعة والجودة |
gemma2-9b-it | 8k | النشر خفيف الوزن أو ذو الميزانية المحدودة |
توصية: لمعظم تطبيقات المحادثة والوكلاء الذكيين، ابدأ بـ llama-4-scout-17b-16e-instruct. يعمل بسرعة تتجاوز 800 رمز في الثانية مع نافذة سياق 131k رمز — كافية لمعظم المهام الحقيقية، وحدود الطبقة المجانية سخية.
الخطوة 5: تنفيذ التدفق في مسار API على Next.js
التدفق ضروري لتجربة مستخدم جيدة في المحادثة — يرى المستخدمون الرموز تظهر فورًا بدلًا من الانتظار حتى اكتمال الاستجابة الكاملة. أنشئ app/api/chat/route.ts:
import { groq } from '@/lib/groq';
import { NextRequest } from 'next/server';
export const runtime = 'nodejs';
export async function POST(req: NextRequest) {
const { messages, model = 'llama-4-scout-17b-16e-instruct' } = await req.json();
const stream = await groq.chat.completions.create({
model,
messages,
stream: true,
max_tokens: 1024,
temperature: 0.7,
});
const encoder = new TextEncoder();
const readable = new ReadableStream({
async start(controller) {
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content ?? '';
if (delta) {
controller.enqueue(encoder.encode(delta));
}
}
controller.close();
},
});
return new Response(readable, {
headers: {
'Content-Type': 'text/plain; charset=utf-8',
'Transfer-Encoding': 'chunked',
'X-Content-Type-Options': 'nosniff',
},
});
}يقوم هذا المسار بما يلي:
- يقبل طلب POST يحمل
messagesونموذجًا اختياريًا - يفتح اتصالًا متدفقًا مع Groq
- يعيد توجيه كل رمز إلى المتصفح فور إنتاجه
- يُغلق التدفق بشكل نظيف عند الانتهاء
الخطوة 6: بناء واجهة المحادثة المتدفقة
أنشئ components/GroqChat.tsx مع التدفق الآني ومقاييس السرعة:
'use client';
import { useState, useRef } from 'react';
interface Message {
role: 'user' | 'assistant';
content: string;
}
const MODELS = [
{ value: 'llama-4-scout-17b-16e-instruct', label: 'Llama 4 Scout (الأسرع)' },
{ value: 'llama-4-maverick-17b-128e-instruct', label: 'Llama 4 Maverick' },
{ value: 'llama-3.3-70b-versatile', label: 'Llama 3.3 70B' },
{ value: 'mixtral-8x7b-32768', label: 'Mixtral 8x7B' },
];
export function GroqChat() {
const [messages, setMessages] = useState<Message[]>([]);
const [input, setInput] = useState('');
const [model, setModel] = useState(MODELS[0].value);
const [loading, setLoading] = useState(false);
const [tokensPerSec, setTokensPerSec] = useState<number | null>(null);
const abortRef = useRef<AbortController | null>(null);
async function sendMessage() {
if (!input.trim() || loading) return;
const userMessage: Message = { role: 'user', content: input };
const newMessages = [...messages, userMessage];
setMessages(newMessages);
setInput('');
setLoading(true);
setTokensPerSec(null);
const assistantMessage: Message = { role: 'assistant', content: '' };
setMessages([...newMessages, assistantMessage]);
abortRef.current = new AbortController();
const startTime = performance.now();
let tokenCount = 0;
try {
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messages: newMessages, model }),
signal: abortRef.current.signal,
});
const reader = res.body!.getReader();
const decoder = new TextDecoder();
let accumulated = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
accumulated += chunk;
tokenCount += chunk.split(' ').length;
setMessages(prev => [
...prev.slice(0, -1),
{ role: 'assistant', content: accumulated },
]);
}
const elapsed = (performance.now() - startTime) / 1000;
setTokensPerSec(Math.round(tokenCount / elapsed));
} catch (err: unknown) {
if (err instanceof Error && err.name !== 'AbortError') {
console.error('خطأ في تدفق Groq:', err);
}
} finally {
setLoading(false);
}
}
return (
<div className="max-w-2xl mx-auto p-4 flex flex-col gap-4" dir="rtl">
<div className="flex items-center gap-2">
<select
value={model}
onChange={e => setModel(e.target.value)}
className="border rounded px-2 py-1 text-sm"
>
{MODELS.map(m => (
<option key={m.value} value={m.value}>{m.label}</option>
))}
</select>
{tokensPerSec !== null && (
<span className="text-sm text-green-600 font-mono">
{tokensPerSec} رمز/ث
</span>
)}
</div>
<div className="flex flex-col gap-2 min-h-64 border rounded p-3 bg-gray-50">
{messages.map((msg, i) => (
<div
key={i}
className={`rounded p-2 text-sm whitespace-pre-wrap ${
msg.role === 'user' ? 'bg-blue-100 self-start' : 'bg-white self-end'
}`}
>
{msg.content}
</div>
))}
{loading && messages.at(-1)?.content === '' && (
<div className="text-gray-400 text-sm animate-pulse">جارٍ التفكير…</div>
)}
</div>
<div className="flex gap-2">
<input
value={input}
onChange={e => setInput(e.target.value)}
onKeyDown={e => e.key === 'Enter' && !e.shiftKey && sendMessage()}
placeholder="اكتب رسالتك…"
className="flex-1 border rounded px-3 py-2 text-sm"
disabled={loading}
/>
<button
onClick={loading ? () => abortRef.current?.abort() : sendMessage}
className="px-4 py-2 bg-blue-600 text-white rounded text-sm"
>
{loading ? 'إيقاف' : 'إرسال'}
</button>
</div>
</div>
);
}الخطوة 7: إضافة استدعاء الأدوات
تدعم Groq استدعاء الأدوات المتوافق مع OpenAI على نماذج Llama 4 وLlama 3.3. إليك مثالًا كاملًا مع أداة طقس:
import Groq from 'groq-sdk';
import { z } from 'zod';
import { groq } from '@/lib/groq';
const tools: Groq.Chat.Completions.ChatCompletionTool[] = [
{
type: 'function',
function: {
name: 'get_weather',
description: 'الحصول على الطقس الحالي لمدينة ما',
parameters: {
type: 'object',
properties: {
city: { type: 'string', description: 'اسم المدينة' },
unit: { type: 'string', enum: ['celsius', 'fahrenheit'] },
},
required: ['city'],
},
},
},
];
const WeatherArgs = z.object({
city: z.string(),
unit: z.enum(['celsius', 'fahrenheit']).default('celsius'),
});
async function getWeather(city: string, unit: string) {
// استبدل بطلب API حقيقي للطقس في الإنتاج
return { city, temperature: unit === 'celsius' ? 22 : 72, condition: 'مشمس' };
}
export async function chatWithTools(userMessage: string) {
const messages: Groq.Chat.Completions.ChatCompletionMessageParam[] = [
{ role: 'user', content: userMessage },
];
const response = await groq.chat.completions.create({
model: 'llama-4-scout-17b-16e-instruct',
messages,
tools,
tool_choice: 'auto',
});
const toolCalls = response.choices[0].message.tool_calls;
if (!toolCalls?.length) {
return response.choices[0].message.content;
}
const toolResults = await Promise.all(
toolCalls.map(async tc => {
const args = WeatherArgs.parse(JSON.parse(tc.function.arguments));
const result = await getWeather(args.city, args.unit);
return {
tool_call_id: tc.id,
role: 'tool' as const,
content: JSON.stringify(result),
};
})
);
const finalResponse = await groq.chat.completions.create({
model: 'llama-4-scout-17b-16e-instruct',
messages: [
...messages,
response.choices[0].message,
...toolResults,
],
});
return finalResponse.choices[0].message.content;
}نصيحة التحقق: حلّل دائمًا وسائط استدعاء الأدوات باستخدام Zod قبل تنفيذها. قد ينتج النموذج JSON مشوهًا أحيانًا — التحقق من الصحة يمنع انتشار هذه الأخطاء في التطبيق.
الخطوة 8: رسائل النظام للمساعدين المتخصصين
تحدد رسائل النظام سلوك المساعد وشخصيته. إليك إعداد لمساعد كتابة الكود:
const CODING_ASSISTANT_PROMPT = `أنت مطوّر TypeScript وReact خبير.
- قدّم دائمًا أمثلة كود كاملة وقابلة للتشغيل
- اشرح المنطق وراء القرارات المعمارية
- أشر إلى مشكلات الأداء أو الثغرات الأمنية المحتملة
- اجعل التفسيرات موجزة لكن شاملة`;
const completion = await groq.chat.completions.create({
model: 'llama-4-maverick-17b-128e-instruct',
messages: [
{ role: 'system', content: CODING_ASSISTANT_PROMPT },
{ role: 'user', content: 'كيف أنفّذ التحديثات التفاؤلية في React Query v5؟' },
],
max_tokens: 2048,
temperature: 0.3,
});دليل درجة الحرارة:
- 0.1–0.3 — استجابات واقعية ومتسقة (الأسئلة التقنية، توليد الكود)
- 0.5–0.7 — توازن بين الإبداع والتماسك (المحادثة العامة)
- 0.8–1.0 — استجابات أكثر تنوعًا وإبداعًا (العصف الذهني، الكتابة)
الخطوة 9: معالجة الأخطاء مع التراجع الأسّي
الطبقة المجانية لها حدود معدل. نفّذ معالجة أخطاء قوية:
import Groq from 'groq-sdk';
import { groq } from '@/lib/groq';
export async function safeGroqCompletion(
messages: Groq.Chat.Completions.ChatCompletionMessageParam[],
retries = 3
): Promise<string | null> {
for (let attempt = 0; attempt < retries; attempt++) {
try {
const completion = await groq.chat.completions.create({
model: 'llama-4-scout-17b-16e-instruct',
messages,
max_tokens: 1024,
});
return completion.choices[0].message.content;
} catch (error) {
if (error instanceof Groq.RateLimitError) {
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}
if (error instanceof Groq.APIError) {
console.error(`خطأ Groq API ${error.status}:`, error.message);
return null;
}
throw error;
}
}
return null;
}نصيحة للإنتاج: خزّن الاستعلامات المتكررة مؤقتًا باستخدام Upstash Redis أو أداة تخزين مؤقت مشابهة بمهلة انتهاء صلاحية محددة. كثير من المستخدمين يطرحون أسئلة مماثلة، والتخزين المؤقت يقلل التكاليف وضغط حدود المعدل.
الخطوة 10: قياس الأداء ومقارنته
إحدى أبرز مزايا Groq هي سرعة الاستدلال الخام. تتبّعها في مقاييس تطبيقك:
export async function completionWithMetrics(prompt: string) {
const start = Date.now();
const completion = await groq.chat.completions.create({
model: 'llama-4-scout-17b-16e-instruct',
messages: [{ role: 'user', content: prompt }],
max_tokens: 512,
});
const elapsed = (Date.now() - start) / 1000;
const usage = completion.usage!;
return {
content: completion.choices[0].message.content,
metrics: {
totalTokens: usage.total_tokens,
completionTokens: usage.completion_tokens,
promptTokens: usage.prompt_tokens,
elapsedSeconds: elapsed,
tokensPerSecond: Math.round(usage.completion_tokens / elapsed),
},
};
}تحقق Groq باستمرار أكثر من 800 رمز في الثانية على Llama 4 Scout. للمقارنة، يوفر معظم مزودي الاستدلال المستضاف 30 إلى 80 رمزًا في الثانية. هذه الميزة في السرعة تكون أكثر أهمية في حلقات الوكلاء الذكيين حيث تحدث 5 إلى 10 استدعاءات LLM متتالية لكل طلب مستخدم.
استكشاف الأخطاء وإصلاحها
خطأ "Invalid API Key"
تأكد من أن مفتاحك يبدأ بـ gsk_ وأنه موجود في .env.local وليس .env. يحمّل Next.js ملف .env.local تلقائيًا فقط في بيئة التطوير.
أخطاء حد المعدل في التطوير
تسمح الطبقة المجانية بـ 30 طلبًا في الدقيقة على معظم النماذج. استخدم التراجع الأسي (الخطوة 9) وفكّر في التبديل إلى gemma2-9b-it خلال التطوير — فله دلو حد معدل منفصل أقل ازدحامًا.
التدفق لا يعمل في الإنتاج
تأكد من أن منصة النشر تدعم الاستجابات المتدفقة. تدعم Vercel وCloudflare Workers وRailway جميعها التدفق. أضف export const runtime = 'nodejs' إلى مسار API الخاص بك إذا واجهت مشاكل على بيئات edge.
أخطاء تحليل استدعاء الأدوات حلّل وسائط الأدوات دائمًا باستخدام Zod قبل التنفيذ (الخطوة 7). قد ينتج LLM أحيانًا JSON مشوهًا — التحقق يمنع انتشاره.
تجاوز نافذة السياق يمتلك Llama 4 Scout نافذة سياق 131k رمز. إذا وصلت إلى الحدود، احذف أقدم الرسائل من السجل مع الاحتفاظ برسالة النظام وآخر N تبادل. نافذة منزلقة من 20 رسالة هي نقطة بداية عملية جيدة.
الخطوات التالية
- استكشف نقاط نهاية الرؤية في Groq لمهام فهم الصور متعددة الوسائط
- جرّب واجهة برمجة تحويل الصوت في Groq (Whisper v3 Large) — تعالج الصوت بسرعة 189 ضعف الوقت الحقيقي
- ابنِ سير عمل متعدد الوكلاء حيث تتولى Groq قرارات المسار السريع ويتولى Claude الاستدلال المعقد
- أضف Langfuse لمراقبة LLM وإدارة إصدارات الـ prompt عبر مزودي النماذج
- نفّذ Cloudflare Workers كـ edge proxy أمام Groq لاستدلال منخفض الكمون على مستوى عالمي
الخلاصة
سرعة استدلال Groq تغيّر جوهريًا ما هو ممكن في تطبيقات الذكاء الاصطناعي. بأكثر من 800 رمز في الثانية، يمكنك بناء تجارب ذكاء اصطناعي استجابية حقًا — مساعدو كتابة الكود التي تبدو فورية، وسير عمل الوكلاء التي تكتمل في ثوانٍ بدلًا من دقائق، وميزات الذكاء الاصطناعي الآنية التي لا تُضحّي بتجربة المستخدم.
تصميم Groq SDK المتوافق مع OpenAI يعني أنه يمكنك نقل مشاريع OpenAI الحالية بتغييرات كود طفيفة. إلى جانب نافذة سياق Llama 4 Scout البالغة 131k رمز وقدراته القوية في الكود والاستدلال وطبقته المجانية السخية، تُعدّ Groq من أكثر الخيارات العملية لتطبيقات الذكاء الاصطناعي الاحترافية في 2026.