Automatizarea proceselor de business, simplu
AIBPA — automatizarea proceselor de business cu AI. AIBPA2 merge un pas mai departe. Având în vedere că SamurAI rulează fluxuri de business descrise într-un fișier XML, atunci de ce să scrii tu acel fișier XML? Cu workflow-ul AIBPA2 descrii procesul în cuvinte, un agent AI îl generează, iar SamurAI îl execută, totul fără nicio linie de cod scrisă de tine.
De la o propoziție la un proces care rulează
Dacă un proces de business poate fi descris în XML, poate fi descris și în cuvinte — iar traducerea o poate face AI-ul.
Descrii procesul
Scrii ce trebuie să se întâmple, cu cuvintele tale: de unde vin datele, ce trebuie înțeles, unde ajunge rezultatul.
AI-ul generează aplicația
Un agent de programare citește documentația și schema XSD SamurAI și scrie
samurai.xml, prompturile pentru pașii cu LLM și eventualele scripturi ajutătoare mici.SamurAI validează și rulează
Validare, rulare din linia de comandă, urmărire în timp real în panoul web, apel prin REST sau ca unealtă MCP. Modelele gratuite au prioritate.
Rezultat lizibil
Rezultatul e un fișier XML scurt, pe care îl poți citi, verifica și versiona — nu o cutie neagră.
Sigur prin concepție
Secretele rămân în .env; comenzile sunt dintr-o listă permisă; fiecare rulare are plafon de cost și jurnal de audit.
Gratuit la rulare
Mai întâi modele gratuite și locale; pașii deterministici („blind”) nu costă nimic.
Importul rețetelor în Yummi
Yummi este o aplicație web de rețete construită pe FoxyUI. Scopul: preiei o rețetă din orice pagină web sau document și o adaugi în Yummi cu ingrediente, cantități, unități, categorie, pași și poze corecte — automat.
1Cererea umană
Aceasta este întreaga specificație, trimisă o singură dată unui agent AI de programare (Claude Code) în proiectul Yummi — ușor editată pentru lizibilitate. Cheia API pe care o conținea a fost eliminată aici.
În subdirectorul „conector” vreau să generezi workflow-ul samurai care va injecta o rețetă în aplicația Yummi prin intermediul API-ului acesteia. Workflow-ul samurai va fi capabil să interpreteze conținutul unui link sau al unui document într-o rețetă culinară. Cheia API este ymk_••••••••. Samurai-ul va cere informațiile necesare din aplicație prin API, va identifica ingredientele, cantitățile, categoria rețetei, modul de preparare, cele mai relevante poze, dacă există, etc. și le va injecta în aplicație.
2Ce a generat AI-ul
Din această singură cerere agentul a produs un workflow SamurAI complet: samurai.xml (94 de rânduri), promptul de extragere sarcini/extrage-reteta.md și scriptul ajutător scripts/yummi.py (doar biblioteca standard Python), care citește pagini web, fișiere .docx și .pdf și comunică cu API-ul Yummi.
samurai.xml aplicația generată — deschide pentru a citi
<?xml version="1.0" encoding="UTF-8"?>
<!--
samurAI → Yummi: interpretează o rețetă dintr-un link, dintr-un document (.docx, .pdf, .txt, .md, .html, .doc, .rtf,
.odt) sau dintr-un text lipit și o trimite în aplicația Yummi prin API-ul ei (Yummi/docs/API-LLM.md).
pregateste BLIND citește sursa (pagina web: text + poze + date schema.org; documentul: text + poze încorporate)
și cere din Yummi categoriile, unitățile și lista de ingrediente (LOV) → contextul modelului
extrage LLM rețeta ca JSON: titlu, categorie, porții, timpi, ingrediente pe secțiuni cu cantități și
unități, pași pe etape, sfaturi, cele mai relevante poze (doar modele gratuite)
trimite BLIND atașează pozele alese, validează cu dryRun, corectează numele aproape identice cu LOV-ul,
verifică dublurile și salvează rețeta (privată) în contul cheii API
Cheile (furnizorii LLM, YUMMI_URL, YUMMI_API_KEY) stau în .env, lângă acest fișier. Comenzile: comands.txt.
-->
<class="t">samurai xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="samurai.xsd" version="1.0"
name="yummi-samurai">
<class="t">config>
<!-- doar furnizori gratuiți, cu cheile din .env; ultima rezervă: abonamentul Claude (CLI-ul claude) -->
<class="t">provider name="gemini" type="gemini" apiKey="${GEMINI_API_KEY}"/>
<class="t">provider name="mistral" type="mistral" apiKey="${MISTRAL_API_KEY}"/>
<class="t">provider name="groq" type="groq" apiKey="${GROQ_API_KEY}"/>
<class="t">provider name="openrouter" type="openrouter" apiKey="${OPENROUTER_API_KEY}"/>
<class="t">provider name="claude-sub" type="claude-code"/>
<class="t">model alias="gemini-flash-free" provider="gemini" model="gemini-flash-latest" freeTier="true" rpm="5" rpd="20"
quality="8" purposes="EXTRACTION"/>
<class="t">model alias="mistral-medium-free" provider="mistral" model="mistral-medium-latest" freeTier="true" rpm="60"
quality="8" purposes="EXTRACTION"/>
<class="t">model alias="gemini-flash-lite-free" provider="gemini" model="gemini-flash-lite-latest" freeTier="true" rpm="12" rpd="490"
quality="7" purposes="EXTRACTION"/>
<class="t">model alias="groq-gpt-oss-120b-free" provider="groq" model="openai/gpt-oss-120b" freeTier="true" rpm="20"
quality="7" purposes="EXTRACTION"/>
<class="t">model alias="openrouter-gemma-31b-free" provider="openrouter" model="google/gemma-4-31b-it:free" freeTier="true" rpm="8" rpd="45"
quality="6" purposes="EXTRACTION"/>
<class="t">model alias="claude-sub-haiku" provider="claude-sub" model="haiku" subscription="true"
quality="5" purposes="EXTRACTION"/>
<class="t">llm><class="t">freeTier enabled="true" cooldown="65s"/></class="t">llm>
<!-- nimic plătit: plafon de siguranță pe rulare -->
<class="t">orchestrator defaultTimeout="15m" maxRunCost="0.01" historySize="20"/>
<class="t">cost factor="1" currency="USD"><class="t">ledger file="./data/costs.jsonl"/></class="t">cost>
<class="t">security>
<class="t">commands allow="python3" maxTimeout="5m"/>
<class="t">audit file="./data/audit.jsonl"/>
</class="t">security>
</class="t">config>
<class="t">agents>
<class="t">command name="verifica" workDir="." description="Legătura cu Yummi: contul cheii API, drepturile, categoriile și LOV-ul (cost 0)">
<class="t">arg>python3</class="t">arg><class="t">arg>scripts/yummi.py</class="t">arg><class="t">arg>verifica</class="t">arg>
</class="t">command>
<class="t">command name="pregateste" workDir="." outputVar="context" processTimeout="3m"
description="Citește sursa (link, document sau text) și contextul din Yummi: categorii, unități, ingrediente (LOV), poze candidate">
<class="t">arg>python3</class="t">arg><class="t">arg>scripts/yummi.py</class="t">arg><class="t">arg>pregateste</class="t">arg><class="t">arg>{{runInput}}</class="t">arg>
</class="t">command>
<class="t">llm name="extrage" purpose="EXTRACTION" jsonMode="true" temperature="0" maxTokens="6000"
acceptRegex=""title"\s*:" maxEscalations="2" retries="1" retryBackoff="20s"
promptFile="sarcini/extrage-reteta.md" outputVar="reteta"
description="Interpretează rețeta: titlu, categorie, porții, timpi, ingrediente cu cantități și unități (din LOV), pași, sfaturi, poze (JSON)">
<class="t">system>Ești un bucătar-redactor care transcrie rețete pentru aplicația Yummi. Extragi exact ce scrie în sursă, fără să inventezi, folosești numele de ingrediente, unitățile și categoriile date. Răspunzi doar cu JSON valid.</class="t">system>
</class="t">llm>
<class="t">command name="trimite" workDir="." pipeInput="true" processTimeout="3m"
description="Atașează pozele alese, validează (dryRun), corectează numele de ingrediente, verifică dublurile și salvează rețeta în Yummi">
<class="t">arg>python3</class="t">arg><class="t">arg>scripts/yummi.py</class="t">arg><class="t">arg>trimite</class="t">arg>
</class="t">command>
<class="t">command name="valideaza" workDir="." pipeInput="true" processTimeout="3m"
description="Ca trimite, dar doar validează în Yummi (dryRun) și arată rețeta interpretată, fără să o salveze">
<class="t">arg>python3</class="t">arg><class="t">arg>scripts/yummi.py</class="t">arg><class="t">arg>trimite</class="t">arg><class="t">arg>--dry</class="t">arg>
</class="t">command>
</class="t">agents>
<class="t">workflows>
<class="t">workflow name="importa"
description="Importă în Yummi rețeta dintr-un link, dintr-un document (.docx, .pdf, .txt, .md, .html, .doc, .rtf, .odt; un .txt poate conține doar linkul) sau dintr-un text lipit: citește sursa și contextul aplicației, interpretează cu un model gratuit ingredientele, cantitățile, categoria, pașii și pozele relevante, apoi salvează rețeta (privată) și întoarce linkul ei">
<class="t">ref agent="pregateste"/>
<class="t">ref agent="extrage"/>
<class="t">ref agent="trimite"/>
</class="t">workflow>
<class="t">workflow name="previzualizare"
description="La fel ca importa, dar nu salvează: arată rețeta interpretată și rezultatul validării din Yummi (ingrediente noi în LOV, avertismente)">
<class="t">ref agent="pregateste"/>
<class="t">ref agent="extrage"/>
<class="t">ref agent="valideaza"/>
</class="t">workflow>
<class="t">workflow name="context" description="Doar contextul trimis modelului: sursa citită, pozele candidate, categoriile și LOV-ul din Yummi (cost 0)" agent="pregateste"/>
<class="t">workflow name="verifica" description="Verifică legătura cu Yummi și dreptul de injecție prin API (cost 0)" agent="verifica"/>
</class="t">workflows>
</class="t">samurai>
sarcini/extrage-reteta.md promptul agentului LLM „extrage”
Extrage UNA singură rețetă din sursa de mai jos și răspunde DOAR cu un obiect JSON pentru API-ul Yummi
(`POST /api/v1/recipes`, schema din Yummi/docs/API-LLM.md §8), cu un singur câmp în plus: `photos` = indicii pozelor
alese din lista „POZE CANDIDATE”.
Reguli:
1. **Nu inventa.** Folosește doar ce scrie în sursă. Ce lipsește rămâne nefolosit (nu pune câmpul). Excepție:
`difficulty` (1 = puțini pași, tehnici simple; 2 = mai multe etape; 3 = tehnici delicate sau timp lung).
2. **Ignoră zgomotul**: povești personale, biografia autorului, reclame și titluri de reclame (ex. „Gustă Sarmale”,
„Utile pescuit”), linkuri spre alte rețete, recenzii, comentarii, butoane, cuprinsuri. Dacă rețeta apare de mai multe
ori (articol + fișă de rețetă), combină-le o singură dată, fără dubluri.
3. **Limba**: română, cu diacritice (ș, ț). Traduce dacă sursa e în altă limbă.
4. **title**: numele scurt al rețetei (fără „Rețetă de”, fără „rețetă originală”), max. 160 de caractere.
5. **category**: exact unul dintre numele din „CATEGORII YUMMI”.
6. **summary**: 1–2 propoziții scrise de tine, despre ce este preparatul (nu copia introducerea).
7. **servings**: numărul de porții din sursă (ex. „pentru 25 de porții” → 25); la cocktailuri = pahare.
**prepMinutes** / **cookMinutes**: DOAR dacă sursa scrie explicit „timp de pregătire / gătire / total” (ore →
minute). Nu le calcula din pași („fierbe 10 minute”) — fără timp explicit, lipsesc.
8. **Ingrediente** — în `ingredientSections` dacă sursa le grupează („Pentru aluat”, „Pentru sos”), altfel în
`ingredients`. **Fiecare rând din lista de ingrediente a sursei apare o dată** (verifică la final că n-ai sărit
niciunul, inclusiv verdețurile și condimentele de la sfârșitul listei). Ingredientele pomenite doar în pași
(ex. „sare și mălai pentru frecat peștele”) se adaugă și ele, fără cantitate.
Fiecare ingredient e un obiect `{"name", "quantity", "unit", "note", "optional"}`:
- `name`: produsul, cu litere mici, **exact un nume din „INGREDIENTE DIN LOV”** când există unul potrivit
(ex. „morcovi”, „ardei gras”, „smântână”); detaliile merg în `note` („tăiat cubulețe”, „galben și roșu”).
Fără virgule în nume. Un nume nou doar când chiar nu există echivalent în listă.
- `quantity`: număr cu punct zecimal (2,5 kg → 2.5); `unit`: una din „UNITĂȚI ACCEPTATE” (forma de singular:
„legătură”, „lingură”); fără unitate la bucăți („5 gălbenușuri” → quantity 5, name „gălbenușuri”).
- interval de cantitate („1-2 legături de mărar”) → `quantity` ca șir: `{"name": "mărar", "quantity": "1-2",
"unit": "legătură", "note": "verde, tocat"}`.
- fără cantitate („supă de pește sau apă”, „sare după gust”) → doar `name` (+ `note`: „sau apă”, „după gust”).
- `optional: true` pentru decor, variante, „opțional”, „după preferință”.
9. **Pași** — în `stepSections` dacă sursa are etape cu titlu („Pregătim peștele”, „Liezonul”), altfel în `steps`.
O acțiune principală pe pas, fără numerotare, fără să repeți lista de ingrediente, fără sfaturi lungi.
10. **notes**: UN SINGUR șir de text cu sfaturile utile ale sursei (secrete, variante, înlocuitori, păstrare,
servire), pe scurt, câte unul pe rând (separate prin \n).
11. **photos**: cel mult 3 indici din „POZE CANDIDATE”, cei mai relevanți întâi — primul = preparatul terminat
(va fi coperta), apoi etape importante. Doar poze ale ACESTEI rețete: nu alege pozele altor rețete recomandate
(alt nume în textul alternativ / alături), logo-uri sau autorul. Dacă nu e niciuna potrivită: `[]`.
12. **public**: `false`.
Format (exemplu de structură, nu de conținut):
{"title": "...", "category": "...", "summary": "...", "servings": 4, "difficulty": 2, "public": false,
"ingredientSections": [{"title": "Pentru ciorbă", "ingredients": [
{"name": "ulei", "quantity": 50, "unit": "ml"},
{"name": "morcovi", "quantity": 400, "unit": "g", "note": "tăiați cubulețe"},
{"name": "mărar", "quantity": "1-2", "unit": "legătură", "note": "tocat"}]}],
"stepSections": [{"title": "Zarzavatul", "steps": ["Încinge uleiul în ceaun.", "..."]}],
"notes": "Primul sfat.\nAl doilea sfat.",
"photos": [1, 6]}
{{input}}
${GEMINI_API_KEY}, ${YUMMI_API_KEY} … și sunt citite din .env la rulare.3Comenzi
Totul rulează cu jar-urile SamurAI și Java — nimic de compilat.
# 1. check the application (cost 0) · verifică aplicația (cost 0) java -jar bin/samurai-studio-1.0-all.jar validate samurai.xml java -jar bin/samurai-studio-1.0-all.jar list samurai.xml java -jar bin/samurai-studio-1.0-all.jar run samurai.xml verifica # 2. import a recipe · importă o rețetă — link, document or text java -jar bin/samurai-studio-1.0-all.jar run samurai.xml importa "https://pofta-buna.com/storceag-ciorba-pescareasca/" java -jar bin/samurai-studio-1.0-all.jar run samurai.xml importa Storceag.docx # 3. preview without saving · previzualizare fără salvare java -jar bin/samurai-studio-1.0-all.jar run samurai.xml previzualizare Storceag.docx # 4. REST API + live web panel on one port · API REST + panoul web pe un port java -jar bin/samurai-studio-web-1.0.jar serve samurai.xml --port 9010 # 5. every workflow as an MCP tool · fiecare flux ca unealtă MCP java -jar bin/samurai-studio-1.0-all.jar mcp samurai.xml
Un orchestrator, cinci agenți, șase modele
Ce a proiectat AI-ul, așa cum îl rulează SamurAI. Un singur pas are nevoie de LLM; restul sunt deterministici și gratuiți.
Citește sursa — pagina web (text, poze, datele schema.org ale rețetei), documentul (text + poze încorporate) sau textul lipit — și cere din Yummi categoriile, unitățile și lista de ingrediente (LOV).
Transformă sursa în JSON-ul de rețetă Yummi: titlu, categorie, porții, ingrediente pe secțiuni cu cantități și unități din LOV, pași, sfaturi, cele mai bune poze. Mod JSON, temperatură 0.
Atașează pozele alese, validează cu o rulare de probă, corectează numele de ingrediente aproape identice, refuză dublurile și salvează rețeta (privată) în contul cheii API.
Modelele disponibile pentru „extrage” (din samurai.xml) — cele gratuite, alese după calitate și cotă, escaladare la eșec (max. 2):
- gemini-flash-free
- mistral-medium-free
- gemini-flash-lite-free
- groq-gpt-oss-120b-free
- openrouter-gemma-31b-free
- claude-sub-haiku
Încă doi agenți: verifica (verifică legătura cu Yummi și drepturile API) și valideaza (ca trimite, dar doar rulare de probă).
importa — pregateste → extrage → trimite: import și salvareprevizualizare — pregateste → extrage → valideaza: previzualizare, nu salvează nimiccontext — doar pregateste: ce ar vedea modelul (cost 0)verifica — verificarea legăturii și a drepturilor (cost 0)Aici nu e nevoie de suborchestratori: un singur orchestrator rulează cele patru fluxuri.
Rularea — capturi din samurai-web
Două importuri reale, rulate pe 8 octombrie 2026 prin API-ul REST și urmărite în panoul web SamurAI, în timp real. Căile locale sunt mascate.

pregateste s-a terminat în 1,2 s, agentul LLM extrage lucrează. În dreapta, evenimentele în timp real.


Rezultatul în Yummi




Fotografia preparatului, importată odată cu rețeta Storceag, aparține site-ului original și nu apare în aceste capturi.
Întrebări frecvente
Care e diferența dintre AIBPA și AIBPA2?
AIBPA (AI Business Process Automation) înseamnă rularea proceselor de business cu agenți AI — la SoftWay, cu framework-ul SamurAI. AIBPA2 adaugă un al doilea nivel de AI: automatizarea însăși este scrisă de AI pornind de la o descriere în cuvinte, deci nimeni nu scrie cod.
Ce este AIBPA2?
AIBPA2 este un workflow SoftWay: descrii un proces de business în cuvinte, un agent AI de programare generează o aplicație SamurAI (un fișier XML plus prompturi și scripturi ajutătoare mici), iar SamurAI o rulează. Nicio linie de cod nu e scrisă de om.
Ce AI generează XML-ul?
Orice agent AI de programare capabil, care poate citi documentația și schema XSD SamurAI. Exemplul Yummi a fost generat de Claude Code dintr-o singură cerere.
Este sigur să lași AI-ul să scrie automatizarea?
Rezultatul este un fișier XML scurt și lizibil, validat cu o schemă XSD. Secretele rămân în .env și apar doar ca variabile, comenzile sunt limitate la o listă permisă, fiecare rulare are plafon de cost și e scrisă în jurnalul de audit, iar porțile de aprobare pot cere decizia unui om înaintea pașilor sensibili.
Cât costă rularea?
În exemplul Yummi, nimic: sunt configurate doar modele gratuite, cu un plafon de siguranță de 0,01 $ pe rulare. Pașii deterministici (citirea surselor, apelurile API, salvarea) nu folosesc deloc LLM.
Poate automatiza și alte procese?
Da. Aceeași abordare funcționează pentru trierea tichetelor, procesarea documentelor și facturilor, aprobări, rapoarte și sincronizarea datelor între sisteme — orice poate descrie SamurAI în XML.