codai docs
Resolve

Prețuri și limite

Cotații fixe de 7 €, 19 € sau 49 € blocate în portofelul în euro și păstrate doar la un fix verificat; trei remedieri gratuite; alimentare la 402; plafoane per utilizator și timeout-uri.

Resolve pune preț pe rezultat, nu pe tokeni — fără fix, fără plată. Triajul cotează unul din trei praguri fixe; plătești acea sumă dacă — și doar dacă — job-ul se termină resolved cu o atestare. Refuzurile, eșecurile și erorile de infrastructură sunt mereu 0 €, iar primele tale 3 remedieri verificate sunt gratuite.

Praguri

PragPrețForma tipică
t77 €Bug mic, bine delimitat: un fișier, reproducere clară.
t1919 €Moderat: mai multe fișiere, are nevoie de investigație.
t4949 €Greu dar plauzibil: subtil, transversal.
free0 €Primele tale 3 remedieri verificate, indiferent de dificultate.

Prețurile sunt în euro, aceleași 7 € / 19 € / 49 € afișate pe codai.ro/ro/pricing. Job-urile plătite se blochează în portofelul tău codai preplătit, ținut în EUR. Nu se aplică niciun curs de schimb nicăieri în pipeline.

Câmpurile de bani pe fir sunt întregi în micro-unități și își păstrează numele istorice _micro_usd pentru stabilitatea API-ului: quote_micro_usd: 19000000 înseamnă o cotație de 19,00, care blochează 19 € în portofel.

Nivelul gratuit

3 remedieri verificate per utilizator, peste toate cheile tale. Este revendicat atomic când sosește un job cotabil: job-ul este creat deja accepted cu tier: "free" și quote_micro_usd: 0, iar free_tier_remaining îți spune ce rămâne după. Un job gratuit care se termină failed sau error își returnează locul. Odată consumate cele trei, job-urile cotabile revin ca quoted și așteaptă acceptul tău.

Job-urile gratuite rulează un singur candidat de fix (greedy); cele plătite se pot ramifica în până la patru — vezi Cum funcționează.

Cum plătești: o blocare în portofel

Acceptul plasează o blocare

POST /v1/resolve/jobs/{id}/accept debitează cotația din portofelul tău în aceeași tranzacție care mută job-ul în accepted. Dacă debitarea nu se poate face, se anulează și schimbarea de status — nu ai niciodată un job pornit fără fonduri blocate, nici fonduri blocate pentru un job care nu a pornit. Job-urile gratuite sar complet peste acest pas.

Fix verificat: blocarea devine plata

Când job-ul se rezolvă, worker-ul scrie întâi rândul de atestare și abia apoi înregistrează plata pe baza blocării. Debitarea pur și simplu rămâne în portofel — nu există o a doua plată, nicio taxare de card și nicio linie separată de factură pentru Resolve. Fără atestare, fără plată: ordinea este impusă în cod.

Orice altceva: rambursare integrală

Un job care se termină failed (niciun fix verificat în buget) sau error (infrastructură, inclusiv un worker pierdut și preluat de watchdog) îți returnează întreaga sumă blocată în portofel, ca intrare de rambursare. Rambursările sunt idempotente per job, deci o decontare reîncercată nu te plătește și nu te taxează de două ori.

Dacă portofelul nu acoperă cotația, accept răspunde 402, iar job-ul rămâne quoted — nu se debitează nimic:

{
  "error": "insufficient_funds",
  "balance": 5000000,
  "required": 19000000,
  "currency": "micro_eur",
  "topup_url": "https://pay.codai.ro/checkout?topup=14"
}

balance și required sunt în micro-EUR. topup_url deschide checkout-ul pay.codai.ro pentru diferență, rotunjită în sus la euro întregi și încadrată în limitele checkout-ului: minimum 10 €, maximum 1000 €. Alimentezi, apoi apelezi din nou /accept pe același id de job. Acțiunea GitHub publică acest link pe issue în locul tău.

Pentru un job t7, 402 conține și "bundle_url": "https://pay.codai.ro/checkout?bundle=resolve10" — cumpărarea pachetului de fix-uri este o alternativă la alimentare.

Preț de introducere

Prima ta remediere plătită costă 1 €. La primul tău accept plătit — oricare dintre t7, t19 sau t49 — Resolve blochează 1 € în loc de prețul de listă. Cât timp ești eligibil, cotația 201 îți spune asta:

{ "status": "quoted", "tier": "t19", "quote_micro_usd": 19000000,
  "intro_price_micro_eur": 1000000, "list_price_micro_eur": 19000000 }
  • Introducerea se consumă doar la un fix verificat. Dacă acel job se termină failed sau error, 1 € se rambursează ca orice blocare, iar introducerea îți este oferită din nou la următorul accept plătit.
  • Ești eligibil cât timp nu ai niciun job plătit verificat și niciun alt job de introducere în zbor (accepted / running) — deci două acceptări paralele nu pot primi amândouă 1 €.
  • Răspunsul de accept raportează "paid_with": "intro" și "held_micro_eur": 1000000.

Pachet de fix-uri

49 € cumpără 10 credite de fix — circa 4,90 € per fix t7 în loc de 7 €. Îl cumperi la pay.codai.ro/checkout?bundle=resolve10.

  • Creditele plătesc doar job-uri t7. t19 și t49 folosesc mereu prețul de introducere sau portofelul.
  • Un credit se ia la accept în locul blocării în portofel ("paid_with": "credit", "held_micro_eur": 0), se returnează la eșec sau eroare și se consumă doar la un fix verificat.
  • GET /v1/resolve/balance întoarce fix_credits, intro_available și wallet_micro_eur.

Ce plătește: ordinea

La accept, Resolve alege prima variantă aplicabilă: nivel gratuit > preț de introducere > credit de fix (doar t7) > portofel. paid_with din răspunsul de accept (și din GET /v1/resolve/jobs/{id} după accept) îți spune ce s-a folosit. O excepție te scutește de un 402 inutil: dacă blocarea de 1 € a introducerii nu încape în portofel, dar pe acel job t7 se poate folosi un credit, se folosește creditul.

Poți vedea costul upstream de model per job (nu ce plătești tu — ce a cheltuit Resolve) ca cost_micro_usd pe GET /v1/resolve/jobs/{id}; este suma utilizării gateway-ului sub id-urile de sesiune ale job-ului.

Nu cheltuim niciodată mai mult de 2× cotația ta pe apeluri de model pentru un job (un plafon fix de 2 $ pentru job-urile gratuite). Acel plafon este al nostru de suportat — nu schimbă niciodată ce plătești.

Limite

Toate limitele sunt per utilizator, numărate peste fiecare cheie pe care o deții.

LimităValoareCe vezi când o atingi
Trimiteri6 pe minut429 rate limited: too many resolve submissions, retry in a minute
Job-uri în zbor (accepted / running)2429 too many resolve jobs in flight, wait for one to finish
Job-uri pe zi10429 daily resolve job cap reached, retry tomorrow
Remedieri verificate gratuite3, pe viață (un job gratuit eșuat sau cu eroare nu consumă una)Cotațiile revin quoted în loc de accepted
Sold în portofel la accept≥ cotația, în EUR402 insufficient_funds cu topup_url; job-ul rămâne quoted
Text de issue50 000 de caractere (acțiunea trunchiază)—

Plafoanele sunt verificate înaintea triajului, așa că o trimitere respinsă nu costă nici un loc, nici un apel de triaj. Ziua se resetează la 00:00 UTC; fiecare body 429 are forma plată { "error": "<mesaj>" } de mai sus, fără header Retry-After.

Timeout-uri

BugetValoareEfect
Job întreg30 de minuteDepășit, job-ul se termină failed (niciun fix verificat în buget) — 0 €.
O rulare în sandbox (setup + teste)15 minuteO suită lentă încheie candidatul; job-ul poate încerca următorul.
Ture de agent per candidat4Editările peste acest număr nu sunt încercate.
Candidați de fix1 (gratuit) / 4 (plătit)Primul succes verificat câștigă; restul sunt săriți.
Watchdog de orfanibuget job + 15 minuteUn job al cărui worker a murit este marcat error (watchdog: worker lost — not billed, safe to resubmit) și un loc gratuit este returnat.
Interogarea acțiunii GitHub25 de minuteAcțiunea nu mai așteaptă și comentează ultimul status; job-ul în sine continuă până la propriul buget.

Triajul rulează inline în POST-ul tău și este limitat de timeout-ul de cerere al gateway-ului; un triaj lent returnează declined cu triage unavailable, please retry în loc să blocheze.

Repository-uri suportate

  • Doar https://github.com/<owner>/<repo> publice. Repo-urile private, alte host-uri și sub-căile de monorepo sunt respinse la trimitere cu 400.
  • Python cu pytest, sau JavaScript/TypeScript cu vitest, jest sau node:test (detectat din package.json).
  • Suita repo-ului trebuie să ruleze dintr-o clonă curată plus manifestul de dependențe comis. Testele care au nevoie de secrete, servicii pornite sau pachete de sistem în afara imaginii runner-ului se termină de regulă în declined sau error.

Ultima actualizare:

Pe această pagină