TuBrief
구독 채널
비디오
커뮤니티

Vercel Eve एजेंट के सर्वरलेस कोल्ड स्टार्ट और लागत को नियंत्रित करने वाला आर्किटेक्चर

TuBrief 편집팀
2026년 7월 23일
0
Computing/Software

원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.

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

관련 영상

शिप 26 एनवाईसी - वर्कशॉप - ईव के साथ एक एजेंट बनाएं: द ओपन एजेंट फ्रेमवर्क39:50

शिप 26 एनवाईसी - वर्कशॉप - ईव के साथ एक एजेंट बनाएं: द ओपन एजेंट फ्रेमवर्क

Vercel

커뮤니티의 다른 글

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

2026년 9월 13일

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

2026년 9월 13일

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

2026년 9월 13일

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

2026년 9월 13일

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

2026년 9월 12일

Apple Won the AI Race

2026년 9월 12일

댓글 (0)

Log in to leave a comment

아직 작성된 글이 없습니다

© 2026 . All rights reserved.

TuBrief
구독 채널
비디오
커뮤니티
로그인

Vercel Eve एजेंट के सर्वरलेस कोल्ड 스타트 और लागत को नियंत्रित करने वाला आर्किटेक्चर

Vercel Eve पर आधारित एजेंट को प्रोडक्शन में अपलोड करते ही सर्वरलेस की अंतर्निहित स्टेटलेसनेस (Statelessness) का सामना करना पड़ता है। जैसे ही अनुरोध समाप्त होता है, इंस्टेंस बंद हो जाता है और निष्पादन स्थिति गायब हो जाती है। इसके बावजूद यदि सेशन को पुनर्स्थापित करने के लिए हर बार PostgreSQL जैसे DB को हिट किया जाता है, तो 100ms से अधिक की देरी के साथ-साथ DB की लागत तेजी से बढ़ जाती है।

सर्वरलेस की सीमाओं को पार करने के लिए वास्तविक प्रोडक्शन में उपयोग की जाने वाली तीन संरचनाओं को यहाँ संक्षेप में प्रस्तुत किया गया है।

1. Upstash Redis के साथ सेशन रीस्टोर लेटेंसी को 50ms से कम करना

सर्वरलेस वातावरण में हर बार नया DB कनेक्शन स्थापित करना इंफ्रास्ट्रक्चर लागत और प्रतिक्रिया गति दोनों को बर्बाद करने का एक आसान तरीका है। HTTP REST API के माध्यम से संचार करने वाले Upstash Redis को सेशन कैश लेयर के रूप में रखकर इस समस्या को हल किया जा सकता है।

`
[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
औसत रीड लेटेंसी 50ms - 200ms 10ms - 20ms 1ms - 5ms (Edge < 50ms)
सर्वरलेस उपयुक्तता कम (Connection Exhaustion) मध्यम (कनेक्शन देरी मौजूद) बहुत उच्च (Scale-to-Zero सपोर्ट)
लागत संरचना प्रोविजनिंग इंस्टेंस प्रति घंटा बिलिंग RCU/WCU अनुरोध इकाई बिलिंग Command अनुरोध इकाई ($0.20/100k)
मुख्य उपयोग उद्देश्य ACID ट्रांजेक्शन, मूल संग्रहण स्थायी डेटा संग्रहण और खोज सेशन कैशिंग, Rate Limit, एजेंट मेमोरी

सेशन स्टोरेज और रीस्टोर कोड को सरल रखा गया है।

`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 });
}

`

जैसे-जैसे बातचीत लंबी होती जाती है, टोकन की लागत बढ़ती जाती है। केवल हाल के 6 टर्न को मूल रूप में रखा जाता है, और पिछली बातचीत को एक हल्के मॉडल के साथ सारांशित करके प्रॉम्प्ट के शीर्ष पर रखा जाता है।

`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. बाहरी API देरी और विफलता सुरक्षा पैटर्न

बाहरी टूल्स को कॉल करते समय 429 (Rate Limit) या 5xx एरर आने पर संपूर्ण एजेंट इंफरेंस टूट जाता है। Full Jitter के साथ एक्सपोनेंशियल बैकऑफ और सर्किट ब्रेकर स्थापित किया जाना चाहिए।

एक्सपोनेंशियल बैकऑफ फॉर्मूला प्रतीक्षा समय को सीधे अनुपात में बढ़ाने के बजाय रैंडम नंबर मिलाकर अड़चनों से बचाता है।

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));
}

}
}

`

यदि विफलता लंबी होती है, तो सर्किट ब्रेकर तुरंत अनुरोधों को ब्लॉक (Fail-Fast) कर देता है और Fallback लॉजिक लागू करता है।

बाहरी API प्रतिक्रिया स्थिति सर्किट ब्रेकर स्थिति कार्य तंत्र एजेंट प्रोसेसिंग परिणाम
HTTP 200 OK Closed सामान्य पास और सफलता काउंटर वृद्धि एजेंट को बाहरी डेटा सफलतापूर्वक आपूर्ति
HTTP 429 / 503 Closed $
ightarrow$ Open एक्सपोनेंशियल बैकऑफ निष्पादन के बाद विफलता दर थ्रेशोल्ड प्राप्त होने पर Open पुनः प्रयास के बाद सर्किट खोलना
Circuit OPEN स्थिति Open बाहरी 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) इंटीग्रेशन

सर्वरलेस फ़ंक्शन निष्पादन समय सीमाओं के साथ आते हैं। भुगतान या DB विलोपन स्वीकृति की प्रतीक्षा में अनुरोध को खुला रखने से टाइमआउट त्रुटियाँ होंगी।

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

`

Eve टूल्स को needsApproval: true दें, निष्पादन रोकें और केवल चेकपॉइंट छोड़ें।

`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 } });
},
});

`

मानवीय स्वीकृति एक वेबहुक कॉलबैक के माध्यम से प्राप्त की जाती है ताकि प्रक्रिया फिर से शुरू हो सके।

`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. CI/CD चरण में प्रॉम्प्ट सत्यापन और कैनरी राउटिंग

प्रॉम्प्ट संशोधन के बाद होने वाले मतिभ्रम (Hallucination) को मैनुअल परीक्षण द्वारा पकड़ना कठिन है। पाइपलाइन को इस तरह से डिज़ाइन किया गया है कि केवल DeepEval मेट्रिक्स को पास करने पर ही PR को मर्ज किया जा सके।

मूल्यांकन मेट्रिक स्वीकार्य थ्रेशोल्ड मूल्यांकन मानदंड
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 स्पेक टूल चयन और प्रकार अनुपालन दर

GitHub Actions में Pytest चलाएं और थ्रेशोल्ड से कम होने पर बिल्ड को ब्लॉक करें।

`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

`

डेप्लॉयमेंट के समय, Edge Config और मिडिलवेयर को लिंक करके नए प्रॉम्प्ट को पहले केवल 10% ट्रैफिक पर लागू किया जाता है।

`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*',
};

`