بناء تطبيقات مدعومة بالوكلاء الذكية باستخدام Next.js و Supabase و Cron في 2026
بناء تطبيقات مدعومة بالوكلاء باستخدام Next.js و Supabase و Cron في عام 2026
لقد قضيت الستة أشهر الماضية منغمسًا في بناء ثلاث تطبيقات مدعومة بالوكلاء للعملاء. اثنتان منهما تعملان بالكامل وتقومان بشكل مستقل بمعالجة آلاف المهام كل يوم. إذاً، ما الذي يغذي هذه المشاريع؟ إنها المجموعة الهائلة من Next.js المنتشر على Vercel و Supabase للحفاظ على البيانات والاحتياجات الفعلية، وتنسيق قائم على cron للحفاظ على توافق الوكلاء ومنع رسوم API الزائدة. هذا ليس مجرد نظرية - سأقسم الأمور إلى ما يعمل والمزالق وجميع الرؤى التي أتمنى أن أكون قد حصلت عليها قبل الغوص.

كيف تبدو التطبيقات المدعومة بالوكلاء فعليًا في عام 2026
عندما أتحدث عن "التطبيقات المدعومة بالوكلاء"، لا أتحدث فقط عن روبوت محادثة يردد موجه نظام. فكر في البرامج التي تتعامل بشكل مستقل مع المهام متعددة الخطوات، وتتخذ قرارات تعتمد على البيانات الفعلية في الوقت الفعلي، وتعمل على جدول زمني، كل ذلك دون حاجة إلى دفع بشري.
إليك مذاق لما يعمل وينتج عن ذلك في الإنتاج:
- خطوط أنابيب المحتوى التي تمسح موجزات RSS، وتولد الملخصات، وتصيغ المنشورات الاجتماعية، وتضعها في قائمة الانتظار للمراجعة. تتكرر هذه الدورة كل 30 دقيقة بانتظام.
- وكلاء المصالحة بين البيانات الذين يتصلون بعدة واجهات برمجية كل ليلة، ويشمون عدم التوافق، ويحاولون الإصلاحات التصحيحية التلقائية، ويصعدون المشاكل التي لا يمكنهم حلها.
- وكلاء تعليم العملاء الجدد الذين تم تشغيلهم من خلال ويبهوك الاشتراك الجديد. يقوم هؤلاء الوكلاء بتوفير الموارد وإرسال تسلسلات مخصصة والتكيف مع تعلمهم سلوكيات المستخدم.
الخيط المشترك؟ يحتاجون إلى استمرارية الحالة والتنفيذ المجدول والوصول إلى الأدوات وطريقة للبشر للقراءة والتدخل عند الحاجة. هذه هي البقعة الحلوة للمكدس الذي نغوص فيه.
لماذا هذا المكدس يعمل
لقد لعبت مع الإعدادات الأخرى. هناك LangChain مقترن بخلفية Python و Temporal للتنسيق وأنظمة طوابير AWS مخصصة. في حين أنهم جميعًا يقومون بهذه المهمة، فإنهم يأتون مع جبل من التعقيد التشغيلي لا يمكن لمعظم الفريق التعامل معه بحلول عام 2026.
إليك مقارنة مباشرة:
| المكدس | وقت الإعداد | النفقات التشغيلية | التكلفة عند 10K مهام/يوم | الأفضل ل |
|---|---|---|---|---|
| Next.js + Supabase + Vercel Cron | 1-2 يوم | منخفضة | ~$85-150/شهر | معظم تطبيقات الوكيل |
| Python + Celery + Redis + AWS | 3-5 أيام | عالية | ~$200-400/شهر | مهام الحوسبة الثقيلة |
| Temporal + Custom Workers | 5-10 أيام | عالية جداً | ~$300-600/شهر | سير العمل المعقدة |
| Inngest + Next.js | 1-2 يوم | منخفضة إلى متوسطة | ~$100-200/شهر | الوكلاء المدفوعة بالأحداث |
يفوز المزيج Next.js بشكل حاسم على السرعة. تحصل على وظائف بدون خادم وواجهة مستخدم لوحة معلومات وقواعد بيانات والمصادقة والتحديثات الفعلية والتنفيذ المجدول دون القلق بشأن البنية الأساسية. بالنسبة لغالبيتنا الذين يبنون تطبيقات الوكيل، فهذا أكثر من كافي.
نظرة عامة على الهندسة المعمارية
لنرسم صورة للعمارة التي كانت ضربة في جميع المشاريع:
┌─────────────────┐ ┌──────────────────┐
│ Vercel Cron │────▶│ Next.js API Route │
│ (Scheduler) │ │ (Agent Runner) │
└─────────────────┘ └────────┬───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌─────────┐ ┌───────────┐
│ Supabase │ │ LLM API │ │ External │
│ (State + │ │ (OpenAI/│ │ Tools & │
│ Queue) │ │ Claude) │ │ APIs │
└──────────┘ └─────────┘ └───────────┘
│
▼
┌──────────┐
│ Supabase │
│ Realtime │──▶ Dashboard UI
└──────────┘
تصل مهام cron إلى مسار Next.js API، والذي يسحب بعد ذلك المهام من Supabase، وينفذ منطق الوكيل، ويكتب النتائج مرة أخرى، والتفاف. في هذه الأثناء، لوحة المعلومات الخاصة بك تراقب الإجراء باستخدام Supabase Realtime التي تقدم التحديثات المباشرة.
نعم، بسيط بما فيه الكفاية، لكن الشيطان يزدهر في التفاصيل.

إعداد الأساس باستخدام Next.js و Vercel
عندما تبني تطبيقات الوكيل في عام 2026، فإن Next.js 15 مع App Router هو من الضروريات. يعطيك أنظف أنماط التنفيذ بفضل Server Actions و Route Handlers. في Social Animal، لقد صقلنا هذه المهارة Next.js، وسأخبرك، لقد نضج App Router بشكل رائع للمشاريع ذات الكثافة الخلفية.
بدء المشروع واضح جداً:
pnpx create-next-app@latest agent-app --typescript --tailwind --app
cd agent-app
pnpm add @supabase/supabase-js ai @ai-sdk/openai
أستخدم Vercel AI SDK بفضل واجهته الموحدة عبر مختلف موفري LLM. بحلول عام 2026، تدعم النسخة 4.x من حزمة ai المخرجات المهيكلة واستدعاءات الأدوات والبث مباشرة خارج الصندوق - من هو LangChain؟
الآن يجب أن تبدو vercel.json الخاصة بك مثل هذا التكوين cron:
{
"crons": [
{
"path": "/api/agents/run",
"schedule": "*/15 * * * *"
},
{
"path": "/api/agents/cleanup",
"schedule": "0 2 * * *"
}
]
}
يعمل cron الأول على الوكيل كل 15 دقيقة. يرتب الثاني كل ليلة. تذكر، Vercel Pro ($20/شهر) يدعم مهام cron بتكرار يصل إلى دقيقة واحدة. ولكن إذا كنت في خطة Hobby، فأنت مقيد بـ crons يومية، وهذا ببساطة لن يفعل لمعظم احتياجات مدعومة بالوكيل.
تكوين وظيفة Vercel
يمكن أن تكون مهام الوكيل أطول من فيلم blockbuster الصيفي (حسنًا، ليس تماماً)، ولكنها تحتاج إلى أكثر من 10 ثوان لتنفيذ بشكل افتراضي. قم بتكوين الطريق الخاص بك مثل هذا:
// app/api/agents/run/route.ts
export const maxDuration = 300; // 5 minutes on Pro plan
export const dynamic = 'force-dynamic';
export async function GET(request: Request) {
// Verify cron secret to prevent unauthorized access
const authHeader = request.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {
return new Response('Unauthorized', { status: 401 });
}
// Agent logic goes here
return Response.json({ success: true });
}
هذا maxDuration؟ إنه حاسم. حتى 300 ثانية على Pro، و 900 ثانية إذا كنت تسبح في مياه Enterprise. أي مهمة روتينية تتجاوز 5 دقائق؟ حان الوقت لتقسيمها أو إعادة التفكير في نموذج التنفيذ الخاص بك.
Supabase كدماغ الوكيل الخاص بك
Supabase - قوة هنا. فهي تقف بمثابة طابور المهام ومتجر الدول وسجل التدقيق والإشعار بك للتحديثات الفعلية. إليك المخطط الذي قمت بضبطه بعناية بمرور الوقت:
-- Agent task queue
CREATE TABLE agent_tasks (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
agent_type TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'running', 'completed', 'failed', 'cancelled')),
priority INTEGER DEFAULT 0,
payload JSONB NOT NULL DEFAULT '{}',
result JSONB,
error TEXT,
attempts INTEGER DEFAULT 0,
max_attempts INTEGER DEFAULT 3,
locked_until TIMESTAMPTZ,
scheduled_for TIMESTAMPTZ DEFAULT NOW(),
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Index for the queue polling query
CREATE INDEX idx_agent_tasks_queue ON agent_tasks (
agent_type, status, priority DESC, scheduled_for
) WHERE status = 'pending';
-- Agent execution logs for observability
CREATE TABLE agent_logs (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
task_id UUID REFERENCES agent_tasks(id),
level TEXT NOT NULL DEFAULT 'info',
message TEXT NOT NULL,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Agent state persistence (for multi-step agents)
CREATE TABLE agent_state (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
agent_type TEXT NOT NULL,
agent_instance_id TEXT NOT NULL,
state JSONB NOT NULL DEFAULT '{}',
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(agent_type, agent_instance_id)
);
هذا العمود locked_until؟ إنها المفتاح. فهي تحاكي قفل موزع مؤقت. هذا يعني عند اختيار مهمة بواسطة وظيفة cron، يتم تعيين locked_until للأمام بمقدار 5 دقائق. إذا توقفت العملية عن العمل، ينتهي القفل، وتستطيع دورة أخرى محاولة أخرى.
استعلام القرص الثابت للمهام
الجوهرة التتويجية. هذا هو تذكرتك الذهبية للقبض على المهام دون إعادة معالجة:
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!
);
async function claimTasks(agentType: string, limit: number = 5) {
const { data: tasks, error } = await supabase
.rpc('claim_agent_tasks', {
p_agent_type: agentType,
p_limit: limit,
p_lock_duration: '5 minutes'
});
if (error) throw error;
return tasks;
}
والدالة Postgres المطابقة:
CREATE OR REPLACE FUNCTION claim_agent_tasks(
p_agent_type TEXT,
p_limit INTEGER,
p_lock_duration INTERVAL
)
RETURNS SETOF agent_tasks AS $$
BEGIN
RETURN QUERY
UPDATE agent_tasks
SET
status = 'running',
locked_until = NOW() + p_lock_duration,
started_at = NOW(),
attempts = attempts + 1,
updated_at = NOW()
WHERE id IN (
SELECT id FROM agent_tasks
WHERE agent_type = p_agent_type
AND status = 'pending'
AND scheduled_for <= NOW()
AND (locked_until IS NULL OR locked_until < NOW())
AND attempts < max_attempts
ORDER BY priority DESC, scheduled_for ASC
LIMIT p_limit
FOR UPDATE SKIP LOCKED
)
RETURNING *;
END;
$$ LANGUAGE plpgsql;
FOR UPDATE SKIP LOCKED هو البطل غير الغنائي هنا. فهي تضمن عدم قيام أي استدعاءات متزامنة بدوس على أقدام بعضها البعض. صدقني، اكتشاف ومعالجة المعالجة المزدوجة لم تكن مرحة.
تنسيق الوكيل القائم على Cron
Vercel Cron هو الإيقاع الثابت لهذه العملية برمتها. كل 15 دقيقة، يدخل العامل الخاص بك في الحركة، ويمسك المهام، ويعالجها، ثم ينام حتى المكالمة التالية.
إليك كيف يبدو مسار العامل الكامل:
// app/api/agents/run/route.ts
import { claimTasks, completeTask, failTask, logAgent } from '@/lib/agents';
import { runContentAgent } from '@/lib/agents/content';
import { runReconciliationAgent } from '@/lib/agents/reconciliation';
export const maxDuration = 300;
const AGENT_RUNNERS: Record<string, (task: AgentTask) => Promise<any>> = {
'content-pipeline': runContentAgent,
'data-reconciliation': runReconciliationAgent,
};
export async function GET(request: Request) {
const authHeader = request.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {
return new Response('Unauthorized', { status: 401 });
}
const results = { processed: 0, failed: 0, skipped: 0 };
for (const [agentType, runner] of Object.entries(AGENT_RUNNERS)) {
const tasks = await claimTasks(agentType, 5);
for (const task of tasks) {
try {
await logAgent(task.id, 'info', `Starting ${agentType} task`);
const result = await runner(task);
await completeTask(task.id, result);
results.processed++;
} catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error';
await failTask(task.id, message);
await logAgent(task.id, 'error', message);
results.failed++;
}
}
}
return Response.json(results);
}
لاحظ المعالجة المتسلسلة لكل نوع وكيل، مع حد أقصى من 5 مهام لكل نوع لكل تشغيل. يساعد هذا على إبقاء أوقات تنفيذ الوظائف تحت السيطرة. هل لديك كومة من 50 مهمة معلقة؟ انشرها على عدة دورات cron. لا عجلة، لا مشكلة.
عندما لا يكون Cron كافيًا
في بعض الأحيان، تأتي الحياة بسرعة، و cron ببساطة لا يقطعها. في هذه الحالات، أدمج cron مع Supabase Database Webhooks أو Edge Functions - فهي تطلق بسبب تغييرات قاعدة البيانات:
-- Trigger an edge function when a high-priority task is created
CREATE OR REPLACE FUNCTION notify_urgent_task()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.priority > 5 THEN
PERFORM net.http_post(
url := 'https://your-app.vercel.app/api/agents/urgent',
headers := jsonb_build_object(
'Authorization', 'Bearer ' || current_setting('app.webhook_secret')
),
body := jsonb_build_object('task_id', NEW.id)
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
يتيح هذا الإعداد لك مزج المعالجة المتوقعة القائمة على cron مع الاستجابة السريعة للمهام العاجلة.
بناء حلقة الوكيل
هنا يحدث السحر. مثال على تنفيذ الوكيل باستخدام استدعاءات أداة Vercel AI SDK:
// lib/agents/content.ts
import { generateText, tool } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import { supabase } from '@/lib/supabase';
export async function runContentAgent(task: AgentTask) {
const { sourceUrl, targetPlatform } = task.payload;
const { text, toolCalls, usage } = await generateText({
model: openai('gpt-4o-mini'),
system: `You are a content processing agent. Fetch the source content,
analyze it, and generate appropriate social media content for ${targetPlatform}.
Use the provided tools to complete your task.`,
prompt: `Process this source: ${sourceUrl}`,
tools: {
fetchContent: tool({
description: 'Fetch content from a URL',
parameters: z.object({ url: z.string().url() }),
execute: async ({ url }) => {
const res = await fetch(url);
const html = await res.text();
// Strip HTML, extract main content
return extractMainContent(html);
},
}),
saveContent: tool({
description: 'Save generated content for review',
parameters: z.object({
title: z.string(),
body: z.string(),
platform: z.string(),
suggestedPostTime: z.string(),
}),
execute: async (content) => {
const { data, error } = await supabase
.from('generated_content')
.insert({
...content,
task_id: task.id,
status: 'pending_review',
})
.select()
.single();
if (error) throw error;
return { saved: true, id: data.id };
},
}),
},
maxSteps: 5, // Allow up to 5 tool-calling rounds
});
return {
summary: text,
toolCallCount: toolCalls.length,
tokensUsed: usage.totalTokens,
};
}
يسمح تعيين maxSteps إلى 5 للنموذج اللغوي استدعاء الأدوات وتقييم النتائج والمعالجة وفقاً لذلك - تماماً مثل عامل صغير يقوم بعمله. معظم مهام المحتوى تنتهي في 3-4 مثل هذه الدعوات.
مراقبة الوكيل الفعلية باستخدام Supabase Realtime
الوكلاء المستقلون رائعون، ولكن الاطلاع عليهم غاية في الأهمية. قوة Supabase Realtime لوحة معلومات توقع في الوقت الفعلي مع تقدم العوامل:
// components/AgentDashboard.tsx
'use client';
import { useEffect, useState } from 'react';
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
);
export function AgentDashboard() {
const [tasks, setTasks] = useState<AgentTask[]>([]);
const [logs, setLogs] = useState<AgentLog[]>([]);
useEffect(() => {
// Subscribe to task changes
const taskChannel = supabase
.channel('agent-tasks')
.on(
'postgres_changes',
{ event: '*', schema: 'public', table: 'agent_tasks' },
(payload) => {
setTasks(prev => {
const updated = [...prev];
const idx = updated.findIndex(t => t.id === payload.new.id);
if (idx >= 0) updated[idx] = payload.new as AgentTask;
else updated.unshift(payload.new as AgentTask);
return updated.slice(0, 50);
});
}
)
.subscribe();
// Subscribe to log stream
const logChannel = supabase
.channel('agent-logs')
.on(
'postgres_changes',
{ event: 'INSERT', schema: 'public', table: 'agent_logs' },
(payload) => {
setLogs(prev => [payload.new as AgentLog, ...prev].slice(0, 100));
}
)
.subscribe();
return () => {
supabase.removeChannel(taskChannel);
supabase.removeChannel(logChannel);
};
}, []);
// Render your dashboard UI...
}
يوفر هذا تدفقًا مباشرًا من نشاط الوكيل. عادة، سأضيف مؤشرات وعدادات مهام ومرئيات معدل الخطأ وحتى زر "تشغيل الآن" للاختبار. Supabase Realtime مدرج في المستوى المجاني - لا يلزم الدفع الإضافي.
التعامل مع الأعطال والحالات الحدية
استعد لأن شيئاً ما سينفجر. تختفي واجهات برمجية التطبيقات وتضرب حدود الأسعار في وجهك أو تجرد الخدمات فقط بريد هراء. إليك ما تعلمته عن بناء الأنظمة التي تبقى على قيد الحياة.
إعادة محاولة مع تراجع أسي
العمودين attempts و max_attempts الذي تضمنناه يتعاملان مع المحاولات. إذا فشلت مهمة، فإنها تتعطل في حالة "فشل" ولكن يمكن تعيينها لإعادة المحاولة يدويًا أو تلقائيًا لاحقًا:
async function failTask(taskId: string, error: string) {
const { data } = await supabase
.from('agent_tasks')
.select('attempts, max_attempts')
.eq('id', taskId)
.single();
const shouldRetry = data && data.attempts < data.max_attempts;
await supabase
.from('agent_tasks')
.update({
status: shouldRetry ? 'pending' : 'failed',
error,
locked_until: null,
// Exponential backoff: 1min, 4min, 9min...
scheduled_for: shouldRetry
? new Date(Date.now() + Math.pow(data.attempts, 2) * 60000).toISOString()
: undefined,
updated_at: new Date().toISOString(),
})
.eq('id', taskId);
}
دوائر كهربائية لواجهات برمجية التطبيقات الخارجية
عندما تعطل واجهات برمجية التطبيقات الخارجية، تلتهم المحاولات الفورية المحاولات بسرعة. احتفظ بأعقاب معدلات الفشل في Supabase، ويمكنك إيقاف الوكلاء إذا بدت الأمور قاتمة:
async function checkCircuitBreaker(service: string): Promise<boolean> {
const fiveMinutesAgo = new Date(Date.now() - 300000).toISOString();
const { count } = await supabase
.from('agent_logs')
.select('*', { count: 'exact', head: true })
.eq('level', 'error')
.ilike('message', `%${service}%`)
.gte('created_at', fiveMinutesAgo);
return (count ?? 0) < 10; // Trip if more than 10 errors in 5 min
}
تحليل التكلفة والتحسين
هنا حيث نتحدث عن الديك الرومي. ما الذي تكلفه تطبيق وكيل الإنتاج في عام 2026؟
| المكون | المستوى المجاني | الإنتاج النموذجي | الاستخدام الثقيل |
|---|---|---|---|
| Vercel Pro | - | $20/شهر | $20/شهر + الاستخدام |
| Supabase Pro | - | $25/شهر | $25/شهر + الاستخدام |
| OpenAI (GPT-4o-mini) | - | $30-80/شهر | $200+/شهر |
| Anthropic (Claude 3.5 Haiku) | - | $20-50/شهر | $150+/شهر |
| الإجمالي | ~$0 (dev) | $95-175/شهر | $395+/شهر |
هذه رسوم LLM؟ يديرون العرض. إليك كيفية الحفاظ على غطاء عليهم:
- استخدم نماذج أصغر حيث أمكن ذلك. يتعامل GPT-4o-mini و Claude 3.5 Haiku مع معظم المهام بجزء صغير من تكلفة أشقائهم الأكبر.
- خزن في الذاكرة المؤقتة قبل الوصول إلى واجهة برمجية التطبيقات. يمكن ل Supabase إخفاء استجابات LLM، مما يقلل من استدعاءات API الجديدة.
- دفعة، دفعة، دفعة. بدلاً من استدعاء API واحد لكل مهمة، قم بدفعة مهام مماثلة وأرسلها معاً.
- حدود الرموز؟ نعم، من فضلك. اضبط دائماً
maxTokensأثناء استدعاءات AI SDK الخاصة بك - منع الجيل الجامح.
أنماط نشر الإنتاج
بمجرد أن تكون في وسط النشر، عدة أشياء حاسمة:
فصل البيئة. الاستفادة من فروع Supabase (Pro المطلوبة) للحفاظ على قواعد بيانات منفصلة للتوسيع والإنتاج. قم بإقران نشرات Vercel preview مع فروع Supabase للعزل الكامل.
المراقبة. توفر قابلية مراقبة Vercel سجل تنفيذ cron وسجلات الوظائف. قم بإقران هذا مع فحص صحة Supabase:
SELECT
agent_type,
status,
COUNT(*) as count,
AVG(EXTRACT(EPOCH FROM (completed_at - started_at))) as avg_duration_seconds
FROM agent_tasks
WHERE created_at > NOW() - INTERVAL '24 hours'
GROUP BY agent_type, status
ORDER BY agent_type, status;
إدارة الأسرار. حماية مفاتيح API الخاصة بك من خلال متغيرات بيئة Vercel، لا تحدد بها أبداً. استخدم مفتاح دور الخدمة فقط من جانب الخادم مع Supabase، مع الاحتفاظ بمفتاح anon على جانب العميل.
إذا كنت تحتاج إلى مساعدة في إعداد الأنظمة مثل هذا، فقد قام فريقنا بتسليم عدة تطبيقات مدعومة بالوكلاء باستخدام هذا المكدس بالضبط. تحقق من قدرات تطوير CMS بدون رأس و تطوير Next.js الخاصة بنا أو تواصل معنا للدردشة حول المشروع الخاص بك.
الأسئلة الشائعة
هل يمكن لـ Vercel Cron التعامل مع مهام الوكيل عالية التكرار؟
يمكن لـ Vercel Cron إدارة فترات زمنية قصيرة تصل إلى دقيقة واحدة على خطة Pro. معظم مهام الوكيل تناسب دورات 5-15 دقيقة. هل تحتاج إلى أسرع؟ فكر في Supabase Database Webhooks أو التبديل إلى Inngest للإجراءات المدفوعة بالأحداث.
كيف أمنع معالجة المهام المكررة مع cron؟
هنا حيث يتألق FOR UPDATE SKIP LOCKED في استعلام مطالبة المهام الخاص بك. إنها شبكة الأمان الخاصة بك حتى لو تداخلت أوقات cron، مما يضمن أن يتم المطالبة بكل مهمة بشكل فريد. يضيف locked_until طبقة من الأمان إذا حدثت كوارث منتصف التنفيذ.
هل Supabase موثوق به لأعباء عمل الوكيل الإنتاجية؟
قطعا. يعمل Supabase Pro على نسخ Postgres المخصصة مع النسخ الاحتياطي الآلية و SLA وقت التشغيل 99.9٪. في الواقع، بالنسبة لنظام طابور المهام هذا، فإن Postgres مؤهل تماماً - قادر على التعامل مع الوصول المتزامن والاستعلامات المعقدة بسهولة.
كم تكلف تشغيل وكلاء AI في الإنتاج؟
عادة، معالجة 5000-10000 مهام يومياً ستعيدك من 95-175 دولار/شهر (Vercel Pro + Supabase Pro) بالإضافة إلى 30-80 دولار/شهر لاستدعاءات API LLM باستخدام نماذج مثل GPT-4o-mini. الطبقة المتغيرة هي تكلفة LLM - اعتمادًا على تعقيد المهمة واستخدام الرموز.
هل يجب أن أستخدم LangChain أم Vercel AI SDK لمنطق الوكيل؟
بحلول عام 2026، يغطي Vercel's AI SDK (v4.x) معظم احتياجات الوكيل بشكل أصلي - استخدام الأدوات والتفكير متعدد الخطوات والمخرجات المهيكلة والبث. LangChain يصبح مفيداً عند الخوض في أنماط التفكير المتقدمة والإعدادات الموجهة للاسترجاع أو التكاملات المتخصصة للأداة. بالنسبة لهذا المكدس، تقل التعقيد مع AI SDK يسود.
هل يمكنني استخدام Astro بدلاً من Next.js لهذا النمط؟
يمكن لـ Astro التعامل مع مسارات API التي تم تشغيلها بواسطة cron، لكنك تفقد تحسينات Vercel، بما في ذلك تكوين cron ومهلات زمنية أطول. إذا كانت لوحة المعلومات الخاصة بك تفضل المحتوى الثقيل والتفاعلات المنخفضة، فإن Astro تناسب الواجهة الأمامية. التزم بـ Next.js للخلفية الخاصة بك.
كيفية مراقبة أداء الوكيل والأخطاء؟
خلط ثلاث طبقات: سجلات Vercel لرؤية مستوى التنفيذ وجدول agent_logs في Supabase لتتبع سجل التطبيق و Supabase Realtime لمراقبة لوحة المعلومات الديناميكية. إنشاء عمليات فحص صحة للأخطاء وأوقات التنفيذ وطول الطابور. يتكامل Vercel بسلاسة مع خدمات التنبيهات مثل PagerDuty و Slack.
ماذا يحدث عندما تتجاوز مهام الوكيل الخاصة بي مهلة انتظار الوظيفة في Vercel؟
على Vercel Pro، لديك سقف مدته 300 ثانية. إذا تجاوزت المهام هذا في كثير من الأحيان، فكر في تقسيمها إلى مهام فرعية صغيرة عبر دورات cron. على سبيل المثال، قم بتقسيم عملية المحتوى إلى مهام "جلب" و "تحليل" و "إنشاء". أو استكشف Supabase Edge Functions لتنفيذ الملمس - لديهم حد 150 ثانية ويمكن تشغيلهم حسب الحاجة.