API-ul Resolve
Fix-uri de bug-uri verificate prin execuție: trimiți un repo și un issue, accepți oferta, primești o atestare publică.
URL de bază https://resolve.codai.ro; aceeași cheie codai_ pe care o folosești la gateway. Beta privat: repo-uri publice github.com, verificare Python/pytest. Fără fix, fără taxă — o taxare se scrie doar după ce există atestarea, iar fiecare câmp de bani e în micro-USD. Atestările sunt publice prin URL (uuid-ul e capabilitatea). Body-ul de eroare aici e { "error": "<string>" }, nu plicul gateway-ului.
bearerAuthAutorizareBearer <codai_…>O cheie API codai existentă. Job-urile aparțin utilizatorului cheii; toate cheile unui utilizator împart aceleași limite și același tier gratuit.
application/json- body
Body-ul pentru POST /v1/resolve/jobs. Furnizezi issue_url sau issue_text (cel puțin unul).
repo_url*stringRepository GitHub public, https://github.com/owner/repo (opțional .git sau slash final). Orice altceva este respins cu 400.
uriissue_url?stringURL de issue GitHub public https://github.com/owner/repo/issues/123. Descărcat fără token; ignorat când issue_text este prezent.
uriissue_text?stringDescrierea inline a issue-ului. Are prioritate față de issue_url. Doar primele 20 000 de caractere ajung la triaj.
10 <= length <= 50000test_command?stringComandă FAIL_TO_PASS opțională (trebuie să eșueze înainte de fix și să treacă după). Când lipsește, agentul scrie întâi un test de reproducere și îl include în atestare.
length <= 2000callback_url?stringȚintă webhook opțională. Trebuie să fie https, fără credențiale în URL și să indice
un host public (fără localhost, adrese private, link-local sau de metadate; fiecare
răspuns DNS este reverificat la livrare). Evenimentele sunt semnate cu
callback_secret-ul per job întors în răspunsul de intake. Redirect-urile nu sunt urmate.
urilength <= 2000Job creat, dar refuzat de triaj.
application/json- response
Body-ul 200 — triajul a refuzat issue-ul. Job-ul este persistat cu status: declined și nu se facturează niciodată.
id*stringuuidstatus*stringdecline_reason*stringcallback_secret?stringPrezent doar când intake-ul a conținut callback_url (se trimite și un eveniment
job.declined). Cheia HMAC-SHA256 pentru semnăturile webhook. Întoarsă o singură
dată — salveaz-o acum.
curl -X POST 'https://resolve.codai.ro/v1/resolve/jobs' \ -H 'Content-Type: application/json' \ -d '{ "repo_url": "https://github.com/psf/requests"}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "status": "declined", "decline_reason": "feature request, no testable behavior", "callback_secret": "whsec_3q2-7wQ1d0X9mZk4Vb8yTnR5sLpA6cEe"}bearerAuthAutorizareBearer <codai_…>O cheie API codai existentă. Job-urile aparțin utilizatorului cheii; toate cheile unui utilizator împart aceleași limite și același tier gratuit.
id*stringUUID-ul job-ului întors de POST /v1/resolve/jobs.
uuidJob găsit.
application/json- response
Vederea completă a job-ului întoarsă de GET /v1/resolve/jobs/{id}. Câmpurile nullable sunt null până rulează etapa corespunzătoare.
id*stringuuidstatus*Starea job-uluiCiclu de viață: triage → quoted → accepted → running → resolved | failed, plus declined
(triajul a refuzat) și error (eșec de infrastructură — se poate reîncerca, nu se facturează niciodată).
"triage""quoted""declined""accepted""running""resolved""failed""error"repo_url*stringURL-ul normalizat al repository-ului (slash-ul final eliminat).
uritier*|Tier-ul cotat; null până se termină triajul.
quote_micro_usd*|Prețul cotat în micro-USD; null până la cotare, 0 pe tier-ul gratuit.
paid_with?Metodă de platăPrezent odată ce job-ul a fost acceptat (și s-a înregistrat cum a fost plătit).
"intro""credit""wallet""free"triage_reason*string|nulldecline_reason*|Setat doar când status este declined.
fail_reason*|Setat când status este failed sau error (de ex. dispatch failed: …).
cost_micro_usd*integerCheltuiala de inferență upstream atribuită acestui job, în micro-USD. Informativ — ți se facturează cotația, nu costul.
attestation_id*|Prezent odată ce job-ul este resolved.
uuidattestation_url*|Calea relativă /v1/resolve/attestations/{attestation_id}; null până la rezolvare.
created_at*stringdate-timecompleted_at*|date-timeissue_url?|URL-ul issue-ului GitHub dat la preluare; null când issue-ul a fost trimis ca text.
uriissue_title?|Prima linie din textul issue-ului (maximum 120 de caractere); null când nu se cunoaște.
curl -X GET 'https://resolve.codai.ro/v1/resolve/jobs/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "status": "triage", "repo_url": "http://example.com", "tier": "free", "quote_micro_usd": 0, "paid_with": "intro", "triage_reason": "string", "decline_reason": "string", "fail_reason": "string", "cost_micro_usd": 0, "attestation_id": "e21e05b4-d2f4-4bc0-ba2d-fc19366a584b", "attestation_url": "/v1/resolve/attestations/1f2c1a3e-8d4b-4f8e-9a1b-0c2d3e4f5a6b", "created_at": "2019-08-24T14:15:22Z", "completed_at": "2019-08-24T14:15:22Z", "issue_url": "http://example.com", "issue_title": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai existentă. Job-urile aparțin utilizatorului cheii; toate cheile unui utilizator împart aceleași limite și același tier gratuit.
id*stringUUID-ul job-ului întors de POST /v1/resolve/jobs.
uuidJob acceptat și trimis la execuție.
application/json- response
id*stringuuidstatus*stringpaid_with*Metodă de platăCum este plătit un job acceptat: free (tier gratuit), intro (primul job plătit,
blocare de 1 €), credit (un credit de fix t7, fără blocare în portofel) sau wallet
(blocarea prețului de listă). Ordine: free > intro > credit > wallet.
"intro""credit""wallet""free"held_micro_eur*integerSuma blocată în portofel în micro-EUR — 1000000 pentru introducere, cotația pentru wallet, 0 pentru credit.
0 <= valuecurl -X POST 'https://resolve.codai.ro/v1/resolve/jobs/497f6eca-6276-4993-bfeb-53cbbbba6f08/accept'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "status": "accepted", "paid_with": "intro", "held_micro_eur": 1000000}id*stringUUID-ul atestării (din attestation_id de pe job).
uuidAtestare găsită.
application/json- response
Dovadă publică de execuție. Tot ce ai nevoie ca să reproduci verificarea local.
id*stringuuidkind*stringrepo_url*stringuribase_commit*stringSHA-ul commit-ului pe care se aplică patch-ul.
patch*stringDiff unificat față de base_commit.
repro_test*|null când clientul a furnizat test_command.
test_command*stringComanda FAIL_TO_PASS care a fost executată.
regression_command*|Comanda PASS_TO_PASS (suita repo-ului), când s-a rulat una.
test_output_before*stringCoada output-ului testelor ÎNAINTE de patch (trebuie să eșueze).
test_output_after*stringCoada output-ului testelor DUPĂ patch (trebuie să treacă).
regression_output*string|nullrunner_image_digest*stringDigest-ul imaginii de container a runner-ului de verificare (unknown când nu a fost înregistrat).
started_at*stringdate-timeverified_at*stringdate-timesignature*|Plic DSSE care semnează declarația canonică a acestei atestări (sha256 al patch-ului,
testului de reproducere și output-urilor; comenzile, commit-ul, digest-ul runner-ului,
timestamp-urile). null pentru atestările create înainte de activarea semnării
(2026-09-27). Verifici cu GET /v1/resolve/keys.
curl -X GET 'https://resolve.codai.ro/v1/resolve/attestations/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "kind": "codai.resolve.attestation.v0", "repo_url": "http://example.com", "base_commit": "3f1e2d4c5b6a798877665544332211aabbccddee", "patch": "string", "repro_test": { "path": "tests/test_repro_issue_6000.py", "content": "string" }, "test_command": "string", "regression_command": "string", "test_output_before": "string", "test_output_after": "string", "regression_output": "string", "runner_image_digest": "string", "started_at": "2019-08-24T14:15:22Z", "verified_at": "2019-08-24T14:15:22Z", "signature": { "payloadType": "application/vnd.codai.resolve.attestation+json;v=1", "payload": "string", "signatures": [ { "keyid": "string", "sig": "string" } ] }}Serviciul este pornit.
application/json- response
ok*booleanservice*stringcurl -X GET 'https://resolve.codai.ro/health'{ "ok": true, "service": "codai-resolve"}Ultima actualizare: