TuBrief
Subscribed Channels
Videos
Community

هيكلية للتحكم في التشغيل البارد (Cold Start) والتكاليف لوكلاء Vercel Eve في بيئة Serverless

TuBrief Editorial
July 23, 2026
0
Computing/Software

Written with AI assistance from the source video. The video is the authority.

العربية한국어EnglishEspañol中文हिन्दीDeutschFrançaisРусскийPortuguês日本語Bahasa Indonesia

Related Video

Ship 26 NYC - ورشة عمل - بناء وكيل باستخدام Eve: إطار عمل الوكلاء المفتوح39:50

Ship 26 NYC - ورشة عمل - بناء وكيل باستخدام Eve: إطار عمل الوكلاء المفتوح

Vercel

More from the community

사내 시스템에 llm api 붙일 때 마주하는 현실적인 한계와 대응법

September 13, 2026

레거시 백엔드에 GPT-6 Astra 붙일 때 예산 승인과 보안 통과를 먼저 끝내는 법이 있습니다

September 13, 2026

에이전트끼리 대화하다 6천만 원 청구서가 나오는 이유

September 13, 2026

사내 RAG 벡터 검색에 Okta 권한 필터를 직접 거는 방법

September 13, 2026

브라우저 에이전트에게 내 구글 계정을 통째로 넘기면 안 되는 이유

September 12, 2026

Apple Won the AI Race

September 12, 2026

Comments (0)

Log in to leave a comment

No posts yet

© 2026 . All rights reserved.

TuBrief
Subscribed Channels
Videos
Community
Log in

هيكلية للتحكم في التشغيل البارد (Cold Start) والتكاليف لوكلاء Vercel Eve في بيئة Serverless

عند نشر وكلاء يعتمدون على Vercel Eve في بيئة الإنتاج، ستواجه فورًا الطبيعة غير الاحتفاظية بالحالة (Statelessness) المميزة لبيئة Serverless. بمجرد انتهاء الطلب، تُغلق النسخة (instance) وتضيع حالة التنفيذ. ومع ذلك، إذا قمت بالوصول إلى DB مثل PostgreSQL في كل مرة لاستعادة الجلسة، فستواجه تأخيرًا يتجاوز 100ms مع زيادة هائلة في تكاليف DB.

لتجاوز قيود Serverless، لخصت ثلاث هياكل فعلية تُستخدم في بيئة الإنتاج.

1. تقليل وقت استجابة (Latency) استعادة الجلسة إلى أقل من 50ms باستخدام Upstash Redis

في بيئة Serverless، يُعد إنشاء اتصال DB جديد في كل مرة أقصر طريق لتدمير تكاليف البنية التحتية وسرعة الاستجابة معًا. يمكن حل هذه المشكلة عن طريق وضع Upstash Redis الذي يتواصل عبر HTTP REST API كطبقة تخزين مؤقت (Cache Layer) للجلسة.

`
[User Request]
│
▼
┌──────────────┐ < 50ms (HTTP REST) ┌────────────────────────┐
│ Vercel Eve │ ────────────────────────> │ Upstash Redis │
│ Agent │ <──────────────────────── │ (Session State Storage)│
└──────────────┘ Session Context Restored└────────────────────────┘
│
│ Compress History (Sliding Window + Summary)
▼
┌──────────────┐
│ LLM Provider │
└──────────────┘

`

يتم جلب بيانات الجلسة عبر REST API في غضون 50ms. استبدال الاستعلام المباشر في RDB بالتخزين المؤقت يقلل بشكل كبير من استهلاك Read Capacity.

معيار التقييم RDB التقليدي (PostgreSQL) DynamoDB (On-Demand) Upstash Redis (HTTP REST)
طريقة الاتصال TCP Socket AWS SDK HTTP/REST API
متوسط وقت الاستجابة (Latency) للقراءة 50ms - 200ms 10ms - 20ms 1ms - 5ms (Edge < 50ms)
التوافق مع Serverless منخفض (Connection Exhaustion) متوسط (وجود تأخير في الاتصال) عالٍ جدًا (دعم Scale-to-Zero)
هيكلة التكلفة الدفع بالساعة للنسخ المزودة (Provisioned) الدفع لكل طلب RCU/WCU الدفع لكل طلب Command ($0.20/100k)
الاستخدامات الرئيسية معاملات ACID، تخزين البيانات الأصلية تخزين وبحث البيانات الدائمة التخزين المؤقت للجلسة، Rate Limit، ذاكرة الوكيل (Agent)

الكود الخاص بحفظ الجلسة واستعادتها يُبقى بسيطًا.

`typescript
import { Redis } from "@upstash/redis";

const redis = Redis.fromEnv();

interface AgentSessionContext {
userId: string;
currentStep: string;
intermediateThoughts: Record<string, unknown>[];
lastActiveTimestamp: number;
}

export async function restoreSessionContext(sessionId: string): Promise<AgentSessionContext | null> {
const cacheKey = session:context:${sessionId};
const cachedContext = await redis.get(cacheKey);
return cachedContext ?? null;
}

export async function saveSessionContext(
sessionId: string,
context: AgentSessionContext,
ttlSeconds: number = 3600
): Promise {
const cacheKey = session:context:${sessionId};
await redis.set(cacheKey, JSON.stringify(context), { ex: ttlSeconds });
}

`

مع طول المحادثة، تستمر تكاليف التوكنز (Tokens) في الازدياد. يتم الاحتفاظ بآخر 6 جولات (Turns) فقط بشكلها الأصلي، بينما يتم استخدام نموذج خفيف الوزن لتلخيص المحادثات السابقة ووضعها في أعلى الموجه (Prompt).

`typescript
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";

interface Message {
role: "user" | "assistant" | "system";
content: string;
}

export async function compressConversationHistory(
messages: Message[],
recentWindowSize: number = 6
): Promise<Message[]> {
if (messages.length <= recentWindowSize) return messages;

const systemMessage = messages.find((m) => m.role === "system");
const nonSystemMessages = messages.filter((m) => m.role !== "system");

const olderMessages = nonSystemMessages.slice(0, nonSystemMessages.length - recentWindowSize);
const recentMessages = nonSystemMessages.slice(nonSystemMessages.length - recentWindowSize);

const summaryResponse = await generateText({
model: openai("gpt-4o-mini"),
prompt: 다음 대화의 핵심 사실과 결정 사항만 200자 이내로 요약하세요:\n\n${JSON.stringify(olderMessages)},
});

const compressedHistory: Message[] = [];
if (systemMessage) compressedHistory.push(systemMessage);
compressedHistory.push({
role: "system",
content: [이전 대화 요약]: ${summaryResponse.text},
});
compressedHistory.push(...recentMessages);

return compressedHistory;
}

`

2. أنماط الحماية من تأخير وفشل واجهة برمجة التطبيقات الخارجية (External API)

أثناء استدعاء أداة خارجية، إذا واجهت خطأ 429 (Rate Limit) أو أخطاء 5xx، فإن عملية استنتاج الوكيل بأكملها تتعطل. يجب إعداد التراجع الأسي (Exponential Backoff) المدمج مع Full Jitter إلى جانب قاطع التيار (Circuit Breaker).

صيغة التراجع الأسي (Exponential Backoff) لا تزيد من وقت الانتظار بشكل طردي، بل تدمج أرقامًا عشوائية لتجنب عنق الزجاجة (Bottleneck).

Textdelay=minleft(Textmax,Textbaseimes2extattemptight)imesleft(0.5+extrandom(0,1.0)ight)T_{ ext{delay}} = minleft(T_{ ext{max}}, T_{ ext{base}} imes 2^{ ext{attempt}} ight) imes left(0.5 + ext{random}(0, 1.0) ight)Textdelay​=minleft(Textmax​,Textbase​imes2extattemptight)imesleft(0.5+extrandom(0,1.0)ight)

`typescript
export interface RetryConfig {
maxRetries: number;
baseDelayMs: number;
maxDelayMs: number;
}

export async function executeWithExponentialBackoff(
fn: () => Promise,
config: RetryConfig = { maxRetries: 3, baseDelayMs: 200, maxDelayMs: 8000 }
): Promise {
let attempt = 0;

while (true) {
try {
return await fn();
} catch (error: any) {
attempt++;
const statusCode = error?.status || error?.response?.status;
const isUnretryable = statusCode && statusCode >= 400 && statusCode < 500 && statusCode !== 429;

  if (attempt > config.maxRetries || isUnretryable) throw error;

  const calculatedDelay = Math.min(
    config.maxDelayMs,
    config.baseDelayMs * Math.pow(2, attempt)
  );
  const jitteredDelay = calculatedDelay * (0.5 + Math.random());

  await new Promise((resolve) => setTimeout(resolve, jitteredDelay));
}

}
}

`

إذا طال أمد العطل، يقوم قاطع التيار (Circuit Breaker) بقطع الطلب فورًا (Fail-Fast) ويقوم بتنفيذ منطق Fallback.

حالة استجابة External API حالة قاطع التيار (Circuit Breaker) آلية التشغيل نتيجة معالجة الوكيل (Agent)
HTTP 200 OK Closed مرور طبيعي وزيادة عداد النجاح توفير البيانات الخارجية للوكيل بشكل طبيعي
HTTP 429 / 503 Closed $
ightarrow$ Open تنشيط Open عند الوصول إلى حد معدل الفشل بعد تنفيذ التراجع الأسي فتح الدائرة (Circuit) بعد إعادة المحاولة
حالة Circuit OPEN Open حجب طلبات شبكة External API (Fail-Fast) استخدام Tool بديلة أو عرض رسالة Fallback
بعد انتهاء Cooldown Half-Open التحقق من تعافي الخدمة الخارجية بطلب Probing فردي تطبيع الدائرة عند النجاح، وإعادة الحجب عند الفشل

`typescript
export class CircuitBreaker {
private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
private failureCount = 0;
private lastStateChange = Date.now();

constructor(
private failureThreshold: number = 5,
private cooldownPeriodMs: number = 30000
) {}

async execute(requestFn: () => Promise, fallbackFn: () => Promise): Promise {
const now = Date.now();

if (this.state === 'OPEN') {
  if (now - this.lastStateChange > this.cooldownPeriodMs) {
    this.state = 'HALF_OPEN';
    this.lastStateChange = now;
  } else {
    return await fallbackFn();
  }
}

try {
  const result = await requestFn();
  if (this.state === 'HALF_OPEN') {
    this.state = 'CLOSED';
    this.failureCount = 0;
    this.lastStateChange = now;
  }
  return result;
} catch (error) {
  this.failureCount++;
  if (this.failureCount >= this.failureThreshold || this.state === 'HALF_OPEN') {
    this.state = 'OPEN';
    this.lastStateChange = now;
  }
  return await fallbackFn();
}

}
}

`

3. ربط الموافقة غير المتزامنة (Human-in-the-loop) بدون أخطاء Timeout

دوال Serverless لها حد لزمن التنفيذ. إذا تركت الطلب مفتوحًا بانتظار الموافقة على دفع أو حذف من DB، فسيحدث خطأ Timeout.

`
[Agent Action] ──> Eve Tool (needsApproval: true)
│
▼
[Checkpoint Saved & Instance Terminated]
│
├─> Slack Notification (Interactive Card)
│
[Human Approve] ───────>│ (Webhook POST Callback)
│
▼
[Resume Agent & Proceed Transaction]

`

يتم تعيين needsApproval: true لأداة Eve، ثم يتم إيقاف التنفيذ وترك Checkpoint فقط.

`typescript
import { defineTool } from "@vercel/eve";
import { z } from "zod";

export const deleteDatabaseTool = defineTool({
name: "delete_database",
description: "특정 테넌트의 영구 데이터베이스 레코드를 삭제합니다.",
needsApproval: true,
input: z.object({
tenantId: z.string(),
reason: z.string(),
}),
execute: async ({ tenantId }) => {
return await db.tenant.delete({ where: { id: tenantId } });
},
});

`

يتم تلقي موافقة الإنسان من خلال Webhook Callback لاستئناف العملية.

`typescript
import { createWebhook } from "@vercel/workflows";

export async function handleApprovalWorkflow(event: { approvalId: string; payload: any }) {
const webhook = createWebhook();

await sendSlackApprovalCard({
approvalId: event.approvalId,
callbackUrl: webhook.url,
payload: event.payload,
});

try {
const { approved, userReason } = await webhook.timeout("12h");

if (!approved) {
  await rollbackPreviousSteps(event.payload);
  return { status: "REJECTED", reason: userReason };
}

return await proceedAction(event.payload);

} catch (error) {
await rollbackPreviousSteps(event.payload);
return { status: "TIMEOUT_CANCELLED" };
}
}

`

4. التحقق من الـ Prompt والتوجيه الكناري (Canary Routing) في مرحلة CI/CD

ظاهرة الهلوسة (Hallucination) التي تحدث بعد تعديل الموجه (Prompt) يصعب اكتشافها بالاختبار اليدوي. يجب إعداد خط الأنابيب (Pipeline) بحيث لا يتم دمج PR إلا بعد اجتياز مقاييس DeepEval.

مقياس التقييم حد القبول معيار التقييم
Faithfulness ge0.85ge 0.85ge0.85 وجود تحريف للحقائق مقارنة بالسياق (Context) المقدم
Answer Relevancy ge0.75ge 0.75ge0.75 مدى التوافق مع هدف سؤال المستخدم
Hallucination Rate le0.10le 0.10le0.10 نسبة حدوث الهلوسة في مجموعة الاختبار
Tool Calling Accuracy ge0.90ge 0.90ge0.90 معدل الالتزام بالأنواع واختيار أداة مواصفات OpenAPI الصحيحة

يتم تنفيذ Pytest في GitHub Actions لحظر عملية البناء (Build) إذا لم يتم الوصول إلى الحد الأدنى (Threshold).

`yaml
name: Eve Agent Prompt Evaluation Pipeline

on:
pull_request:
branches: [ main ]

jobs:
evaluate-agent:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

  - name: Set up Python
    uses: actions/setup-python@v5
    with:
      python-version: '3.11'

  - name: Install Evaluation Dependencies
    run: |
      pip install deepeval pytest

  - name: Run DeepEval Regression Suite
    env:
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
      ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
    run: |
      pytest test_agent_evals.py --deepeval-metric-threshold=0.85

`

عند النشر (Deployment)، يتم ربط Edge Config مع البرامج الوسيطة (Middleware) لتطبيق الموجه (Prompt) الجديد أولاً على 10% فقط من حركة المرور (Traffic).

`typescript
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { get } from '@vercel/edge-config';

export async function middleware(req: NextRequest) {
const res = NextResponse.next();
let variant = req.cookies.get('agent_canary_variant')?.value;

if (!variant) {
const canaryRate = (await get('canary_traffic_rate')) || 0.10;
variant = Math.random() < canaryRate ? 'canary' : 'control';
res.cookies.set('agent_canary_variant', variant, { path: '/', httpOnly: true });
}

res.headers.set('x-agent-prompt-version', variant === 'canary' ? 'v2-canary' : 'v1-stable');
return res;
}

export const config = {
matcher: '/api/agent/:path*',
};

`