codai docs
Referință API

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.

POST
/v1/resolve/jobs

Autorizare

bearerAuth
headerAutorizareBearer <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.

Corpul cererii

application/json
  1. body

Body-ul pentru POST /v1/resolve/jobs. Furnizezi issue_url sau issue_text (cel puțin unul).

repo_url*string

Repository GitHub public, https://github.com/owner/repo (opțional .git sau slash final). Orice altceva este respins cu 400.

Formaturi
issue_url?string

URL de issue GitHub public https://github.com/owner/repo/issues/123. Descărcat fără token; ignorat când issue_text este prezent.

Formaturi
issue_text?string

Descrierea inline a issue-ului. Are prioritate față de issue_url. Doar primele 20 000 de caractere ajung la triaj.

Lungime10 <= length <= 50000
test_command?string

Comandă 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.

Lungimelength <= 2000
callback_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.

Formaturi
Lungimelength <= 2000

Corpul răspunsului

Job creat, dar refuzat de triaj.

application/json
  1. response

Body-ul 200 — triajul a refuzat issue-ul. Job-ul este persistat cu status: declined și nu se facturează niciodată.

id*string
Formatuuid
status*string
decline_reason*string
callback_secret?string

Prezent 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.

Exemplu de cerere
curl -X POST 'https://resolve.codai.ro/v1/resolve/jobs' \  -H 'Content-Type: application/json' \  -d '{  "repo_url": "https://github.com/psf/requests"}'
Exemplu de răspuns
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "status": "declined",  "decline_reason": "feature request, no testable behavior",  "callback_secret": "whsec_3q2-7wQ1d0X9mZk4Vb8yTnR5sLpA6cEe"}
GET
/v1/resolve/jobs/{id}

Autorizare

bearerAuth
headerAutorizareBearer <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.

Parametri de cale

id*string

UUID-ul job-ului întors de POST /v1/resolve/jobs.

Formatuuid

Corpul răspunsului

Job găsit.

application/json
  1. 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*string
Formatuuid
status*Starea job-ului

Ciclu 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ă).

Valoare din"triage""quoted""declined""accepted""running""resolved""failed""error"
repo_url*string

URL-ul normalizat al repository-ului (slash-ul final eliminat).

Formaturi
tier*|

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).

Valoare din"intro""credit""wallet""free"
triage_reason*string|null
decline_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*integer

Cheltuiala 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.

Formatuuid
attestation_url*|

Calea relativă /v1/resolve/attestations/{attestation_id}; null până la rezolvare.

created_at*string
Formatdate-time
completed_at*|
Formatdate-time
issue_url?|

URL-ul issue-ului GitHub dat la preluare; null când issue-ul a fost trimis ca text.

Formaturi
issue_title?|

Prima linie din textul issue-ului (maximum 120 de caractere); null când nu se cunoaște.

Exemplu de cerere
curl -X GET 'https://resolve.codai.ro/v1/resolve/jobs/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Exemplu de răspuns
{  "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"}
POST
/v1/resolve/jobs/{id}/accept

Autorizare

bearerAuth
headerAutorizareBearer <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.

Parametri de cale

id*string

UUID-ul job-ului întors de POST /v1/resolve/jobs.

Formatuuid

Corpul răspunsului

Job acceptat și trimis la execuție.

application/json
  1. response
id*string
Formatuuid
status*string
paid_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.

Valoare din"intro""credit""wallet""free"
held_micro_eur*integer

Suma blocată în portofel în micro-EUR — 1000000 pentru introducere, cotația pentru wallet, 0 pentru credit.

Interval0 <= value
Exemplu de cerere
curl -X POST 'https://resolve.codai.ro/v1/resolve/jobs/497f6eca-6276-4993-bfeb-53cbbbba6f08/accept'
Exemplu de răspuns
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "status": "accepted",  "paid_with": "intro",  "held_micro_eur": 1000000}
GET
/v1/resolve/attestations/{id}

Parametri de cale

id*string

UUID-ul atestării (din attestation_id de pe job).

Formatuuid

Corpul răspunsului

Atestare găsită.

application/json
  1. response

Dovadă publică de execuție. Tot ce ai nevoie ca să reproduci verificarea local.

id*string
Formatuuid
kind*string
repo_url*string
Formaturi
base_commit*string

SHA-ul commit-ului pe care se aplică patch-ul.

patch*string

Diff unificat față de base_commit.

repro_test*|

null când clientul a furnizat test_command.

test_command*string

Comanda 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*string

Coada output-ului testelor ÎNAINTE de patch (trebuie să eșueze).

test_output_after*string

Coada output-ului testelor DUPĂ patch (trebuie să treacă).

regression_output*string|null
runner_image_digest*string

Digest-ul imaginii de container a runner-ului de verificare (unknown când nu a fost înregistrat).

started_at*string
Formatdate-time
verified_at*string
Formatdate-time
signature*|

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.

Exemplu de cerere
curl -X GET 'https://resolve.codai.ro/v1/resolve/attestations/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Exemplu de răspuns
{  "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"      }    ]  }}
GET
/health

Corpul răspunsului

Serviciul este pornit.

application/json
  1. response
ok*boolean
service*string
Exemplu de cerere
curl -X GET 'https://resolve.codai.ro/health'
Exemplu de răspuns200
{  "ok": true,  "service": "codai-resolve"}

Ultima actualizare: