# Nu construi un agent. Construiește fabrica de agenți.

Oricine poate construi un agent AI într-un weekend. Un model bun, câteva tool-uri, un prompt de sistem decent — și ai un demo care impresionează în ședința de luni. Am scris deja despre [diferența dintre un model și un agent](/ro/blog/ai-model-vs-agent) și despre [cum arată agenții în producție](/ro/blog/ai-agents-2026), așa că nu reiau partea aia.

Problema reală apare la a doua întrebare, cea pe care demo-ul de weekend nu o atinge niciodată: ce se întâmplă când **zece echipe** vor fiecare agentul lor? Fiecare cu acces la CRM, la tichete, la baze de date. Fiecare cu propriile chei API, propriile prompturi, propria idee despre ce înseamnă „merge". Fără un răspuns la întrebarea asta, obții ce văd acum în multe companii: o grămadă de agenți-pilot care nu ajung niciodată în producție, pentru că nimeni nu poate spune cine are voie la ce, cât de bine funcționează și ce se strică la următorul release.

Răspunsul la ea nu e „încă un agent", ci o **arhitectură de agenți** — fabrica internă prin care orice echipă poate lansa agenți guvernați, testați și cu acces controlat la sistemele companiei. Articolul ăsta descrie cele patru piese ale arhitecturii și de ce ai nevoie de fiecare.

## Cele două straturi

Prima clarificare, pentru că aici se încurcă majoritatea discuțiilor: agentul pe care îl vede utilizatorul și platforma de dedesubt sunt straturi diferite, cu probleme diferite.

Stratul de aplicație e ce construiești pentru un caz de folosință concret: orchestrare cu sub-agenți, RAG peste documentele relevante, porți de aprobare unde un om validează acțiunile sensibile. E stratul pe care l-am construit și noi în proiectele cu clienți și despre care se scriu 95% din articolele despre agenți.

Stratul de platformă e ce face ca **al doilea, al cincilea și al zecelea** agent să nu ia totul de la zero. El răspunde la trei întrebări pe care aplicația nu are cum să le rezolve singură: cine are voie la ce sistem, cât de bun e un agent înainte să-l lansezi și cum află echipa B că agentul echipei A există deja.

<div class="article-figure">
<svg viewBox="0 0 900 470" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Arhitectura pe două straturi: stratul de aplicație cu sub-agenți, RAG aplicativ și porți de aprobare, deasupra stratului de platformă cu catalog și evaluări, gateway, servere MCP și RAG partajat, care stă în fața sistemelor companiei">
<text x="10" y="22" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="15px" font-weight="600" text-anchor="start">Două straturi: agentul și fabrica</text>
<rect x="10" y="40" width="880" height="120" rx="12" fill="#181d27" stroke="#2a3147" stroke-width="1"/>
<text x="30" y="66" fill="#7b8cff" font-family="DM Mono, ui-monospace, monospace" font-size="12px" font-weight="600" text-anchor="start">STRATUL DE APLICAȚIE — ce vede utilizatorul</text>
<rect x="30" y="82" width="270" height="60" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="165" y="108" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Sub-agenți</text>
<text x="165" y="127" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">orchestrare pe task-uri</text>
<rect x="315" y="82" width="270" height="60" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="450" y="108" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">RAG aplicativ</text>
<text x="450" y="127" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">răspunsuri din documente</text>
<rect x="600" y="82" width="270" height="60" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="735" y="108" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Porți de aprobare</text>
<text x="735" y="127" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">omul validează acțiunile</text>
<line x1="450" y1="160" x2="450" y2="186" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="450,196 444,184 456,184" fill="#6b7a99"/>
<rect x="10" y="196" width="880" height="150" rx="12" fill="#181d27" stroke="#4fffb0" stroke-opacity="0.4" stroke-width="1"/>
<text x="30" y="222" fill="#4fffb0" font-family="DM Mono, ui-monospace, monospace" font-size="12px" font-weight="600" text-anchor="start">STRATUL DE PLATFORMĂ — fabrica de agenți</text>
<rect x="30" y="238" width="200" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="130" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Catalog + Evaluări</text>
<text x="130" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">registru, scoruri,</text>
<text x="130" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">regresii la release</text>
<rect x="250" y="238" width="200" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="350" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Gateway</text>
<text x="350" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">auth, rate limiting,</text>
<text x="350" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">logging centralizat</text>
<rect x="470" y="238" width="200" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="570" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Servere MCP</text>
<text x="570" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">tool-uri și date expuse</text>
<text x="570" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">printr-un protocol standard</text>
<rect x="690" y="238" width="180" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="780" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">RAG partajat</text>
<text x="780" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">ingestie și căutare</text>
<text x="780" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">pentru toate echipele</text>
<line x1="450" y1="346" x2="450" y2="372" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="450,382 444,370 456,370" fill="#6b7a99"/>
<rect x="10" y="382" width="880" height="52" rx="12" fill="#181d27" stroke="#2a3147" stroke-width="1"/>
<text x="450" y="413" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13px" font-weight="400" text-anchor="middle">Sistemele companiei: CRM · tichete · documente · baze de date · API-uri interne</text>
<text x="10" y="460" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="start">Echipele construiesc sus. Platforma garantează jos: acces, calitate, vizibilitate.</text>
</svg>
</div>

Restul articolului ia pe rând piesele stratului de jos.

## Catalogul de agenți: registru plus evaluări, nu wiki

Prima piesă sună banal și e cea mai subestimată: un **registru intern de agenți**. Fiecare agent are o intrare cu descriere, tool-urile la care are acces, echipa owner și versiunea curentă. Echipele îl consultă înainte să construiască ceva nou — exact ca un registru de servicii sau un catalog de API-uri interne.

| Câmp | Exemplu |
|---|---|
| Nume | `support-triage-agent` |
| Descriere | Triază tichetele de suport și propune un răspuns |
| Owner | Echipa Customer Platform |
| Versiune | 1.4.2 |
| Tool-uri (prin gateway) | `crm.search` · `tickets.update` · `kb.retrieve` |
| Scoruri evaluări | calitate 92 · corectitudine 96 · siguranță 100 |
| Ultima regresie | trecută · 27 august 2026 |

Diferența față de un wiki e ultimele două rânduri. Un catalog fără evaluări e o listă de promisiuni; un catalog cu evaluări e un contract. Pentru fiecare agent există **seturi de teste** — scenarii reale de intrare cu rezultate așteptate — și scoruri pe trei axe: calitate (cât de utile sunt răspunsurile), corectitudine (câte afirmații sunt factual adevărate, câte acțiuni sunt cele corecte) și siguranță (refuză ce trebuie să refuze, nu scurge date între clienți, nu execută acțiuni în afara mandatului).

Regula care leagă totul: **nu publici o versiune nouă în catalog dacă nu trece evaluările.** Inclusiv — mai ales — suita veche. Un agent care la v1.4 rezolvă un caz nou dar strică trei cazuri care mergeau la v1.3 nu se lansează. Asta e CI/CD, aplicat la agenți:

<div class="article-figure">
<svg viewBox="0 0 900 310" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Pipeline de release pentru agenți: o versiune nouă trece prin evaluări și praguri; dacă trece e publicată în catalog, dacă pică e blocată; la fiecare release se rulează și regresiile pe suita veche">
<text x="10" y="22" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="15px" font-weight="600" text-anchor="start">CI/CD pentru agenți: nimic nu intră în catalog fără evaluări</text>
<rect x="10" y="58" width="190" height="96" rx="10" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="105" y="100" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Versiune nouă</text>
<text x="105" y="121" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">v1.4 a agentului de suport</text>
<line x1="200" y1="106" x2="230" y2="106" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="240,106 228,100 228,112" fill="#6b7a99"/>
<rect x="240" y="58" width="210" height="96" rx="10" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="345" y="94" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Evaluări</text>
<text x="345" y="114" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">seturi de teste,</text>
<text x="345" y="130" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">LLM-as-judge</text>
<line x1="450" y1="106" x2="480" y2="106" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="490,106 478,100 478,112" fill="#6b7a99"/>
<rect x="490" y="58" width="200" height="96" rx="10" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="590" y="94" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Praguri</text>
<text x="590" y="114" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">calitate · corectitudine</text>
<text x="590" y="130" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">siguranță · fără regresii</text>
<line x1="690" y1="88" x2="722" y2="76" stroke="#4fffb0" stroke-opacity="0.7" stroke-width="1.5"/>
<polygon points="732,72 719,71 723,82" fill="#4fffb0" fill-opacity="0.8"/>
<line x1="690" y1="124" x2="722" y2="136" stroke="#ff6b6b" stroke-opacity="0.7" stroke-width="1.5"/>
<polygon points="732,140 723,130 719,141" fill="#ff6b6b" fill-opacity="0.8"/>
<rect x="732" y="46" width="158" height="52" rx="10" fill="#181d27" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<text x="811" y="68" fill="#4fffb0" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13px" font-weight="600" text-anchor="middle">✓ Publicat în catalog</text>
<text x="811" y="87" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">vizibil pentru toate echipele</text>
<rect x="732" y="114" width="158" height="52" rx="10" fill="#181d27" stroke="#ff6b6b" stroke-opacity="0.5" stroke-width="1"/>
<text x="811" y="136" fill="#ff6b6b" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13px" font-weight="600" text-anchor="middle">✗ Blocat</text>
<text x="811" y="155" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">înapoi la dezvoltare</text>
<path d="M 811 166 L 811 216 L 345 216 L 345 164" fill="none" stroke="#6b7a99" stroke-width="1" stroke-dasharray="5 4"/>
<polygon points="345,156 339,168 351,168" fill="#6b7a99"/>
<text x="578" y="236" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">la fiecare versiune, toată suita veche se rulează din nou — regresiile blochează release-ul</text>
<text x="10" y="290" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="start">Exact ca la cod: build → teste → gate. Doar că „testele” sunt evaluări cu scoruri, nu assert-uri binare.</text>
</svg>
</div>

Partea nedeterministă e singura noutate reală. Un test de cod e binar; un răspuns de agent e „suficient de bun" sau nu. De aceea evaluările combină verificări exacte (a apelat tool-ul corect? a respectat formatul?) cu **LLM-as-judge** — un model care punctează răspunsul după o rubrică scrisă de oameni. Nu e perfect, dar e consistent, ieftin și rulează la fiecare release, ceea ce un review uman nu poate.

În AWS, piesa asta există ca serviciu — evaluările din Amazon Bedrock AgentCore — dar se construiește la fel de bine ca pipeline propriu: un set de scenarii în git, un job care rulează agentul pe ele și un judge care punctează. Important e gate-ul, nu unealta.

## Gateway: un singur loc prin care agenții ating lumea

A doua piesă rezolvă o problemă de aritmetică. Trei agenți care vorbesc direct cu cinci sisteme înseamnă cincisprezece integrări: cincisprezece locuri unde se gestionează credențiale, cincisprezece locuri de auditat, cincisprezece implementări de rate limiting — de obicei zero. Fiecare agent nou înmulțește problema.

Gateway-ul o transformă din N × M în N + M: agenții vorbesc cu un singur strat, iar stratul ăla știe **cine are voie la ce**.

<div class="article-figure">
<svg viewBox="0 0 900 400" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Comparație: fără gateway, trei agenți se conectează direct la cinci sisteme prin cincisprezece integrări; cu gateway, agenții vorbesc cu un singur strat care centralizează autentificarea, autorizarea, rate limiting-ul și logging-ul">
<text x="10" y="22" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="15px" font-weight="600" text-anchor="start">Fără gateway vs. cu gateway</text>
<rect x="10" y="40" width="430" height="310" rx="12" fill="#181d27" stroke="#ff6b6b" stroke-opacity="0.35" stroke-width="1"/>
<text x="30" y="68" fill="#ff6b6b" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="start">Fără gateway: N × M conexiuni</text>
<text x="225" y="98" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">agenți</text>
<line x1="105" y1="134" x2="79" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="157" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="235" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="313" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="391" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="79" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="157" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="235" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="313" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="391" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="79" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="157" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="235" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="313" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="391" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<circle cx="105" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="225" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="345" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<rect x="47" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="79" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">CRM</text>
<rect x="125" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="157" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Tichete</text>
<rect x="203" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="235" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Docs</text>
<rect x="281" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="313" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">DB</text>
<rect x="359" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="391" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Lambda</text>
<text x="225" y="334" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">15 integrări · credențiale peste tot · audit imposibil</text>
<rect x="460" y="40" width="430" height="310" rx="12" fill="#181d27" stroke="#4fffb0" stroke-opacity="0.35" stroke-width="1"/>
<text x="480" y="68" fill="#4fffb0" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="start">Cu gateway: N + M conexiuni</text>
<text x="675" y="98" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">agenți</text>
<circle cx="555" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="675" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="795" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<line x1="555" y1="134" x2="601" y2="168" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="675" y1="134" x2="675" y2="168" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="795" y1="134" x2="749" y2="168" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<rect x="520" y="168" width="310" height="64" rx="8" fill="#1e2535" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<text x="675" y="194" fill="#4fffb0" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="14px" font-weight="600" text-anchor="middle">Gateway</text>
<text x="675" y="214" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">autentificare · autorizare · rate limiting · logging</text>
<line x1="529" y1="232" x2="529" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="607" y1="232" x2="607" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="685" y1="232" x2="685" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="763" y1="232" x2="763" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="830" y1="232" x2="841" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<rect x="497" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="529" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">CRM</text>
<rect x="575" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="607" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Tichete</text>
<rect x="653" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="685" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Docs</text>
<rect x="731" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="763" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">DB</text>
<rect x="809" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="841" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Lambda</text>
<text x="675" y="334" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">8 conexiuni · un singur punct de control și audit</text>
<text x="10" y="384" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="start">Bonus: un API existent (REST, Lambda) devine tool MCP la nivel de gateway, fără să-l rescrii.</text>
</svg>
</div>

Concret, gateway-ul centralizează patru lucruri pe care altfel le reimplementează fiecare echipă prost și diferit: **autentificarea** (agenții primesc identități, nu chei API copiate prin prompturi), **autorizarea** (agentul de suport vede tichetele, nu și salariile), **rate limiting-ul** (un agent intrat în buclă nu pune CRM-ul în genunchi) și **logging-ul** (fiecare apel de tool, cu identitatea agentului atașată — singurul mod în care răspunzi la „cine a modificat înregistrarea asta?").

A doua funcție, mai puțin evidentă dar enormă în practică: gateway-ul **traduce API-uri existente în tool-uri MCP fără să le rescrii**. Ai un REST API intern sau o funcție Lambda? O descrii la nivel de gateway și devine un tool pe care orice agent compatibil îl poate apela. În AWS, exact asta face AgentCore Gateway; același pattern se construiește și standalone.

## Serverele MCP: stratul care expune efectiv tool-urile

Sub gateway stau serverele care chiar expun tool-urile și datele: CRM, tichete, documente, baze de date. Am scris despre [MCP din perspectiva unui setup local](/ro/blog/mcp-lm-studio); la nivel enterprise logica e identică, doar miza crește — MCP e ce oprește platforma să devină o colecție de integrări proprietare.

Pentru că protocolul e standard, serverul MCP pentru tichete scris de o echipă e refolosibil de orice agent din companie, indiferent de framework-ul cu care e construit agentul. Iar când vendorii tăi expun ei înșiși servere MCP — tot mai frecvent — le pui în spatele aceluiași gateway și primesc aceleași reguli de acces și același audit ca tool-urile interne. Cuplul gateway + MCP e ce transformă „integrare" dintr-un proiect de trei săptămâni într-o înregistrare de configurare.

## RAG: partajat, nu reinventat per agent

Ultima piesă e cea pe care o știi deja — cu o singură corecție de poziționare. RAG apare în ambele straturi, dar altceva se construiește în fiecare: aplicația decide *ce întreabă și ce face cu răspunsul*; platforma deține *conductele* — ingestia documentelor, indexarea, embedding-urile, și mai ales **filtrarea pe permisiuni la momentul căutării**. Dacă fiecare echipă își face propriul pipeline de ingestie, obții cinci indexuri care îmbătrânesc în ritmuri diferite și cel puțin unul care servește documente confidențiale cui nu trebuie. Retrieval-ul e infrastructură, ca baza de date; rubrica de „ce documente are voie să vadă agentul ăsta" aparține platformei, nu bunelor intenții ale fiecărui prompt.

## De ce ai nevoie de o arhitectură de agenți

Pentru că niciuna dintre problemele de mai sus nu se rezolvă în interiorul unui agent. Poți scrie cel mai bun agent din lume și tot nu ai răspuns la „cine are voie la ce", „cât de bun e înainte de release" și „ce se strică la următorul" — astea sunt proprietăți ale sistemului din jurul agenților, nu ale vreunui agent anume.

Și dacă te uiți la cele patru piese împreună, observi că niciuna nu e despre AI în sens strict. Catalogul e governance. Evaluările sunt QA. Gateway-ul e securitate și networking. RAG-ul partajat e platformă de date. Modelul — partea „AI" — e o dependență, nu produsul. De-asta problema e una de arhitectură, nu de prompturi mai bune.

Asta e, cred, cea mai utilă lentilă pentru momentul de față: suntem cu agenții unde era software-ul înainte de DevOps. Toată lumea știe să scrie unul; aproape nimeni nu are pipeline-ul care îi dă drumul în producție în siguranță, îl măsoară și îl retrage când decade. Diferența dintre demo și producție nu e un model mai bun — e arhitectura din jurul lui.

Și ordinea practică, dacă pornești de la zero, e inversă față de entuziasm: întâi un gateway cu un singur server MCP în spate și logging pe fiecare apel. Apoi un set de evaluări pentru primul agent — chiar și 30 de scenarii bat zero. Catalogul vine al treilea, când ai ce pune în el. RAG-ul partajat, când a doua echipă cere aceleași documente ca prima.

Un agent care merge în demo e un weekend. O fabrică prin care zece echipe lansează agenți fără să-și dea foc una alteia e o arhitectură. Dacă ești în punctul în care primul există și a doua lipsește, [hai să vorbim](/contact).
