Planificator
Sarcini agent, comenzi terminal, webhook-uri și lanțuri programate, rulate pe oricare PC, telefon, ceas sau VM cloud al tău — cron sau cuvinte, aprobări, reîncercări, failover și stare live.
Planificatorul codai rulează sarcini după un orar pe toate dispozitivele tale. Cloud-ul deține fiecare programare și decide când e scadentă o rulare; gazdele tale (aplicația desktop, codaid pe servere și VM-uri, telefonul) preiau rulările, le execută și raportează rezultatul. O singură listă, un singur istoric și aceleași aprobări în hub, pe desktop, telefon și ceas.
Ce poate rula
- agent — o sarcină agent codai (
prompt, opționalskill,permissionsread / edit / pr). - shell — o comandă terminal pe o gazdă (
command,cwd,env_names,shell). Valorile secrete nu părăsesc gazda: programarea doar numește variabilele. - http — un webhook HTTPS (
method,url,headers,body,expect_status). - chain — rulează alte programări în ordine (
steps,stop_on_failure). - phone_action — notificare, pornește un agent, deschide o aplicație, comută Wi-Fi sau Nu deranja pe un telefon.
Când
trigger este o expresie cron cu fus orar (5 sau 6 câmpuri, semantica zilelor din vixie-cron), un at unic, un interval, un event de declanșator sau after altă programare (la succes, eșec sau mereu). POST /v1/schedules/preview transformă cuvinte în română sau engleză („în zilele lucrătoare la 9”, "every day at 3") în cron și întoarce următoarele cinci rulări plus un avertisment când o rulare cade într-o fereastră de schimbare a orei. Rulările ratate (gazdă adormită, întrerupere) urmează misfire: skip, once (implicit) sau all_within în misfire_window_min.
Unde
target alege o singură gazdă, orice gazdă cu toate etichetele tags, any gazdă online, cloud-ul codai sau un cloud_vm al unui proiect. O rulare cloud_vm (shell sau http) ajunge la daemonul unuia dintre mediile tale cloud codai din acel proiect; dacă niciunul nu e online, planificatorul pornește mediul oprit folosit cel mai recent (e nevoie de soldul pentru o oră în portofel), iar timeout-ul de inactivitate al mediului îl oprește din nou după rulare. failover listează seturi de etichete de încercat când ținta e offline. O gazdă preia o rulare cu un lease de 60 de secunde (POST /v1/scheduler/claim, FOR UPDATE SKIP LOCKED, deci două gazde nu iau niciodată aceeași rulare), îl menține cu heartbeat și raportează rezultatul. Un lease expirat devine o încercare nouă pe care o poate prelua altă gazdă. Cu native: true și o singură gazdă țintă, aplicația desktop oglindește programarea și în planificatorul sistemului de operare (Task Scheduler, launchd sau timere systemd), ca să ruleze chiar dacă codai nu e pornit.
Siguranță
- Comenzile shell au nevoie de aprobarea gazdei. O programare shell păstrează sha256 al
shell, cwd, command, nume variabile. Fiecare gazdă îți arată o dată comanda exactă și aprobă acel hash (POST /v1/schedules/{id}/approve-command); orice modificare schimbă hash-ul și șterge toate aprobările. - Aprobare pe rulare.
policy.approval=alwayssauoutside_hours(cuquiet_hours) pune rulările înawaiting_approval; primești o notificare pe fiecare dispozitiv, inclusiv pe ceas, și aprobi sau sari de pe oricare. - Limite.
policy.max_runs_per_hour, bugete pe rulare și pe zi (micro-USD),overlap(skip,queue,kill),timeout_sșiretriescuretry_backoff_s. - Alerte. Eșecurile (
alert_on_fail) și rulările pe care nu le-a pornit nimeni înlate_after_strimit o notificare cu link direct către rulare.
Pauză, zile sărite și control al zgomotului
- Mod vacanță.
POST /v1/schedules/pause(opționaluntil) oprește crearea rulărilor pentru toate programările;POST /v1/schedules/resumeo încheie, iarbackfill: truedă fiecărei programări care a ratat sloturi exact o rulare de recuperare. - Zile sărite.
policy.skip_dayssare peste sărbătorile legale din România (holidays: 'RO', inclusiv Paștele și Rusaliile ortodoxe), zile ale săptămânii alese sau date exacte, în fusul orar al declanșatorului. Sloturile sărite nu se creează deloc. - Bugete și pauză automată. Când rulările de azi ating
policy.budget_micro_usd_per_day, rulările noi se sar, cu o singură alertă pe zi. Dupăpolicy.pause_after_failureseșecuri consecutive (implicit 3) programarea se dezactivează singură și te anunță. - Notificări.
notify=on_failure(implicit),on_change(doar când ieșirea normalizată diferă de ultimul succes: orele și id-urile sunt ignorate),alwayssaunever. - Șabloane.
GET /v1/schedules/templateslistează programări gata făcute, de exemplu rezumatul săptămânal al transcrierilor (sumar, decizii, acțiuni, trimis pe email în fiecare vineri la 17:00).
Monitoare heartbeat
Pentru joburi pe care codai nu le rulează (un crontab pe un VM, un job CI, un job Cloud Scheduler), creează un monitor cu POST /v1/heartbeats { name, period_s, grace_s }. Răspunsul conține ping_url o singură dată. Jobul îl apelează:
GET|POST /ping/<token>la succes,/ping/<token>/startla pornire,/ping/<token>/failla eșec sau/ping/<token>/<cod de ieșire>.
Lipsa unui succes în period_s + grace_s (sau o pornire fără succes în toleranță) marchează monitorul down și alertează o dată toate dispozitivele; următorul succes îl marchează up și îți spune că și-a revenit.
# crontab: backup, apoi raportează codul de ieșire
0 3 * * * /srv/backup.sh; curl -fsS -m 10 https://ai.codai.ro/ping/<token>/$?bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
until?stringdate-timeresume_policy?string"skip""backfill"OK.
application/json- response
[key: string]?anycurl -X POST 'https://ai.codai.ro/v1/schedules/pause' \ -H 'Content-Type: application/json' \ -d '{}'{}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
backfill?booleanOK.
application/json- response
[key: string]?anycurl -X POST 'https://ai.codai.ro/v1/schedules/resume' \ -H 'Content-Type: application/json' \ -d '{}'{}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
[key: string]?anycurl -X GET 'https://ai.codai.ro/v1/schedules/templates'{}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
template*stringparams?OK.
application/json- response
[key: string]?anycurl -X POST 'https://ai.codai.ro/v1/schedules/templates' \ -H 'Content-Type: application/json' \ -d '{ "template": "string"}'{}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
heartbeats*array<>curl -X GET 'https://ai.codai.ro/v1/heartbeats'{ "heartbeats": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "period_s": 0, "grace_s": 0, "tz": "string", "status": "new", "last_ping_at": "2019-08-24T14:15:22Z", "last_start_at": "2019-08-24T14:15:22Z", "last_exit_code": 0, "ping_url": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
name*stringlength <= 120period_s*integer60 <= value <= 2592000grace_s?integer60 <= value <= 604800tz?stringCreat.
application/json- response
Un monitor heartbeat.
id*stringuuidname*stringperiod_s*integergrace_s*integertz?stringstatus*string"new""up""late""down""paused"last_ping_at?stringdate-timelast_start_at?stringdate-timelast_exit_code?integerping_url?stringOnly in the create response.
created_at?stringdate-timeupdated_at?stringdate-timecurl -X POST 'https://ai.codai.ro/v1/heartbeats' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "period_s": 60}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "period_s": 0, "grace_s": 0, "tz": "string", "status": "new", "last_ping_at": "2019-08-24T14:15:22Z", "last_start_at": "2019-08-24T14:15:22Z", "last_exit_code": 0, "ping_url": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul monitorului.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
name?stringlength <= 120period_s?integer60 <= value <= 2592000grace_s?integer60 <= value <= 604800paused?booleanOK.
application/json- response
Un monitor heartbeat.
id*stringuuidname*stringperiod_s*integergrace_s*integertz?stringstatus*string"new""up""late""down""paused"last_ping_at?stringdate-timelast_start_at?stringdate-timelast_exit_code?integerping_url?stringOnly in the create response.
created_at?stringdate-timeupdated_at?stringdate-timecurl -X PATCH 'https://ai.codai.ro/v1/heartbeats/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "period_s": 0, "grace_s": 0, "tz": "string", "status": "new", "last_ping_at": "2019-08-24T14:15:22Z", "last_start_at": "2019-08-24T14:15:22Z", "last_exit_code": 0, "ping_url": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul monitorului.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Șters.
curl -X DELETE 'https://ai.codai.ro/v1/heartbeats/497f6eca-6276-4993-bfeb-53cbbbba6f08'Stare live
GET /v1/schedules/stream trimite un eveniment schedule când se schimbă o programare sau o rulare își schimbă starea pe orice dispozitiv, așa că fiecare ecran se actualizează într-o secundă.
import { Codai } from 'codai-sdk';
const codai = new Codai({ apiKey: process.env.CODAI_API_KEY! });
const preview = await codai.schedules.preview({ text: 'every weekday at 9', tz: 'Europe/Bucharest' });
const backup = await codai.schedules.create({
name: 'Nightly backup',
kind: 'shell',
spec: { command: 'restic backup ~/work' },
trigger: { type: 'cron', expr: '0 3 * * *', tz: 'Europe/Bucharest' },
target: { type: 'tags', tags: ['pc'] },
retries: 2,
});
for await (const e of codai.schedules.stream()) console.log(e.op, e.state);from codai import Codai
codai = Codai(api_key="codai_...", device="7f0e3c1a-...")
job = codai.schedules.executor.claim() # host side; None when there is nothing to run
if job:
codai.schedules.executor.result(job["run"]["id"], {"attempt": job["run"]["attempt"], "ok": True, "exit_code": 0})bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
schedules*array<>curl -X GET 'https://ai.codai.ro/v1/schedules'{ "schedules": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "description": "string", "enabled": true, "kind": "agent", "spec": {}, "trigger": {}, "target": {}, "failover": [ [ "string" ] ], "native": true, "policy": {}, "misfire": "skip", "misfire_window_min": 0, "overlap": "skip", "timeout_s": 0, "retries": 0, "retry_backoff_s": 0, "late_after_s": 0, "alert_on_fail": true, "template": "string", "command_hash": "string", "next_run_at": "2019-08-24T14:15:22Z", "last_run_at": "2019-08-24T14:15:22Z", "upcoming": [ "2019-08-24T14:15:22Z" ], "approvals": [ { "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "command_hash": "string", "approved_at": "2019-08-24T14:15:22Z" } ], "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
Câmpurile programării. kind alege forma lui spec: agent {prompt, skill?, permissions?}, shell {command, cwd?, env_names?, shell?}, http {method?, url, headers?, body?, expect_status?}, chain {steps, stop_on_failure?}, phone_action {action, params?}.
name*stringlength <= 120description?stringenabled?booleankind*string"agent""shell""http""chain""phone_action"spec*trigger*cron {type, expr, tz}, at {type, at}, interval {type, every_s}, event {type, trigger_id} sau after {type, schedule_id, on}.
target?host {type, device_id}, tags {type, tags}, any, cloud sau cloud_vm {type, project_id}.
failover?array<array<string>>native?booleanpolicy?Aprobare (niciodată, mereu, în afara orelor de liniște), ore de liniște, bugete pe rulare și pe zi (micro-USD) și limita de rulări pe oră.
misfire?string"skip""once""all_within"misfire_window_min?integeroverlap?string"skip""queue""kill"timeout_s?integerretries?integerretry_backoff_s?integerlate_after_s?integeralert_on_fail?booleantemplate?stringCreat.
application/json- response
O sarcină programată.
id*stringuuidname*stringlength <= 120description?stringenabled*booleankind*string"agent""shell""http""chain""phone_action"spec?trigger*cron {type, expr, tz}, at {type, at}, interval {type, every_s}, event {type, trigger_id} sau after {type, schedule_id, on}.
target*host {type, device_id}, tags {type, tags}, any, cloud sau cloud_vm {type, project_id}.
failover?array<array<string>>native?booleanpolicy?Aprobare (niciodată, mereu, în afara orelor de liniște), ore de liniște, bugete pe rulare și pe zi (micro-USD) și limita de rulări pe oră.
misfire?string"skip""once""all_within"misfire_window_min?integeroverlap?string"skip""queue""kill"timeout_s?integerretries?integerretry_backoff_s?integerlate_after_s?integeralert_on_fail?booleantemplate?stringcommand_hash?stringnext_run_at?stringdate-timelast_run_at?stringdate-timeupcoming*array<>approvals?array<>created_at?stringdate-timeupdated_at?stringdate-timecurl -X POST 'https://ai.codai.ro/v1/schedules' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "kind": "agent", "spec": {}, "trigger": {}}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "description": "string", "enabled": true, "kind": "agent", "spec": {}, "trigger": {}, "target": {}, "failover": [ [ "string" ] ], "native": true, "policy": {}, "misfire": "skip", "misfire_window_min": 0, "overlap": "skip", "timeout_s": 0, "retries": 0, "retry_backoff_s": 0, "late_after_s": 0, "alert_on_fail": true, "template": "string", "command_hash": "string", "next_run_at": "2019-08-24T14:15:22Z", "last_run_at": "2019-08-24T14:15:22Z", "upcoming": [ "2019-08-24T14:15:22Z" ], "approvals": [ { "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "command_hash": "string", "approved_at": "2019-08-24T14:15:22Z" } ], "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
text?stringlength <= 200trigger?tz?string"Europe/Bucharest"OK.
application/json- response
ok*booleanreason?string"not_understood""invalid"trigger?next_runs?array<>dst_warning?booleancurl -X POST 'https://ai.codai.ro/v1/schedules/preview' \ -H 'Content-Type: application/json' \ -d '{}'{ "ok": true, "reason": "not_understood", "trigger": {}, "next_runs": [ "2019-08-24T14:15:22Z" ], "dst_warning": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
response?stringtext/event-streamcurl -X GET 'https://ai.codai.ro/v1/schedules/stream'"string"bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul programării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
O sarcină programată.
id*stringuuidname*stringlength <= 120description?stringenabled*booleankind*string"agent""shell""http""chain""phone_action"spec?trigger*cron {type, expr, tz}, at {type, at}, interval {type, every_s}, event {type, trigger_id} sau after {type, schedule_id, on}.
target*host {type, device_id}, tags {type, tags}, any, cloud sau cloud_vm {type, project_id}.
failover?array<array<string>>native?booleanpolicy?Aprobare (niciodată, mereu, în afara orelor de liniște), ore de liniște, bugete pe rulare și pe zi (micro-USD) și limita de rulări pe oră.
misfire?string"skip""once""all_within"misfire_window_min?integeroverlap?string"skip""queue""kill"timeout_s?integerretries?integerretry_backoff_s?integerlate_after_s?integeralert_on_fail?booleantemplate?stringcommand_hash?stringnext_run_at?stringdate-timelast_run_at?stringdate-timeupcoming*array<>approvals?array<>created_at?stringdate-timeupdated_at?stringdate-timecurl -X GET 'https://ai.codai.ro/v1/schedules/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "description": "string", "enabled": true, "kind": "agent", "spec": {}, "trigger": {}, "target": {}, "failover": [ [ "string" ] ], "native": true, "policy": {}, "misfire": "skip", "misfire_window_min": 0, "overlap": "skip", "timeout_s": 0, "retries": 0, "retry_backoff_s": 0, "late_after_s": 0, "alert_on_fail": true, "template": "string", "command_hash": "string", "next_run_at": "2019-08-24T14:15:22Z", "last_run_at": "2019-08-24T14:15:22Z", "upcoming": [ "2019-08-24T14:15:22Z" ], "approvals": [ { "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "command_hash": "string", "approved_at": "2019-08-24T14:15:22Z" } ], "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul programării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
[key: string]?anyOK.
application/json- response
O sarcină programată.
id*stringuuidname*stringlength <= 120description?stringenabled*booleankind*string"agent""shell""http""chain""phone_action"spec?trigger*cron {type, expr, tz}, at {type, at}, interval {type, every_s}, event {type, trigger_id} sau after {type, schedule_id, on}.
target*host {type, device_id}, tags {type, tags}, any, cloud sau cloud_vm {type, project_id}.
failover?array<array<string>>native?booleanpolicy?Aprobare (niciodată, mereu, în afara orelor de liniște), ore de liniște, bugete pe rulare și pe zi (micro-USD) și limita de rulări pe oră.
misfire?string"skip""once""all_within"misfire_window_min?integeroverlap?string"skip""queue""kill"timeout_s?integerretries?integerretry_backoff_s?integerlate_after_s?integeralert_on_fail?booleantemplate?stringcommand_hash?stringnext_run_at?stringdate-timelast_run_at?stringdate-timeupcoming*array<>approvals?array<>created_at?stringdate-timeupdated_at?stringdate-timecurl -X PATCH 'https://ai.codai.ro/v1/schedules/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "description": "string", "enabled": true, "kind": "agent", "spec": {}, "trigger": {}, "target": {}, "failover": [ [ "string" ] ], "native": true, "policy": {}, "misfire": "skip", "misfire_window_min": 0, "overlap": "skip", "timeout_s": 0, "retries": 0, "retry_backoff_s": 0, "late_after_s": 0, "alert_on_fail": true, "template": "string", "command_hash": "string", "next_run_at": "2019-08-24T14:15:22Z", "last_run_at": "2019-08-24T14:15:22Z", "upcoming": [ "2019-08-24T14:15:22Z" ], "approvals": [ { "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "command_hash": "string", "approved_at": "2019-08-24T14:15:22Z" } ], "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul programării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Gata, fără conținut.
curl -X DELETE 'https://ai.codai.ro/v1/schedules/497f6eca-6276-4993-bfeb-53cbbbba6f08'bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul programării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Acceptat.
application/json- response
queued*booleancurl -X POST 'https://ai.codai.ro/v1/schedules/497f6eca-6276-4993-bfeb-53cbbbba6f08/run'{ "queued": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul programării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
runs*array<>curl -X GET 'https://ai.codai.ro/v1/schedules/497f6eca-6276-4993-bfeb-53cbbbba6f08/runs'{ "runs": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "schedule_id": "8929bb67-0da1-406c-99d2-5447376a4f58", "scheduled_for": "2019-08-24T14:15:22Z", "state": "pending", "attempt": 0, "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "exit_code": 0, "cost_micro_usd": 0, "log_tail": "string", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "error": "string", "created_at": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul programării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128x-codai-device*stringUUID stabil al dispozitivului. Înregistrează dispozitivul la prima folosire (nume/platformă din x-codai-device-name / x-codai-device-platform) și selectează protocolul de sesiuni partajate.
uuidapplication/json- body
command_hash*string^[0-9a-f]{64}$OK.
application/json- response
approved*booleandevice_id*stringuuidcurl -X POST 'https://ai.codai.ro/v1/schedules/497f6eca-6276-4993-bfeb-53cbbbba6f08/approve-command' \ -H 'x-codai-device: 497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{ "command_hash": "string"}'{ "approved": true, "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
limit?integer1 <= value <= 20050x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
runs*array<>curl -X GET 'https://ai.codai.ro/v1/schedule-runs'{ "runs": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "schedule_id": "8929bb67-0da1-406c-99d2-5447376a4f58", "scheduled_for": "2019-08-24T14:15:22Z", "state": "pending", "attempt": 0, "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "exit_code": 0, "cost_micro_usd": 0, "log_tail": "string", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "error": "string", "created_at": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul rulării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
approve*booleanOK.
application/json- response
O execuție a unei programări.
id*stringuuidschedule_id*stringuuidscheduled_for*stringdate-timestate*string"pending""awaiting_approval""claimed""running""succeeded""failed""timed_out""skipped""cancelled"attempt*integerdevice_id?stringuuidstarted_at?stringdate-timefinished_at?stringdate-timeexit_code?integercost_micro_usd?integerlog_tail?stringsession_id?stringuuiderror?stringcreated_at?stringdate-timecurl -X POST 'https://ai.codai.ro/v1/schedule-runs/497f6eca-6276-4993-bfeb-53cbbbba6f08/decision' \ -H 'Content-Type: application/json' \ -d '{ "approve": true}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "schedule_id": "8929bb67-0da1-406c-99d2-5447376a4f58", "scheduled_for": "2019-08-24T14:15:22Z", "state": "pending", "attempt": 0, "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "exit_code": 0, "cost_micro_usd": 0, "log_tail": "string", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "error": "string", "created_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul rulării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128x-codai-device*stringUUID stabil al dispozitivului. Înregistrează dispozitivul la prima folosire (nume/platformă din x-codai-device-name / x-codai-device-platform) și selectează protocolul de sesiuni partajate.
uuidapplication/json- body
attempt*integer1 <= valuelog?stringlength <= 16384Gata, fără conținut.
curl -X POST 'https://ai.codai.ro/v1/schedule-runs/497f6eca-6276-4993-bfeb-53cbbbba6f08/heartbeat' \ -H 'x-codai-device: 497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{ "attempt": 1}'bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul rulării.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128x-codai-device*stringUUID stabil al dispozitivului. Înregistrează dispozitivul la prima folosire (nume/platformă din x-codai-device-name / x-codai-device-platform) și selectează protocolul de sesiuni partajate.
uuidapplication/json- body
attempt*integer1 <= valueok*booleanexit_code?integererror?stringlength <= 4000log_tail?stringlength <= 65536cost_micro_usd?integer0 <= valuesession_id?stringuuidtimed_out?booleanOK.
application/json- response
O execuție a unei programări.
id*stringuuidschedule_id*stringuuidscheduled_for*stringdate-timestate*string"pending""awaiting_approval""claimed""running""succeeded""failed""timed_out""skipped""cancelled"attempt*integerdevice_id?stringuuidstarted_at?stringdate-timefinished_at?stringdate-timeexit_code?integercost_micro_usd?integerlog_tail?stringsession_id?stringuuiderror?stringcreated_at?stringdate-timecurl -X POST 'https://ai.codai.ro/v1/schedule-runs/497f6eca-6276-4993-bfeb-53cbbbba6f08/result' \ -H 'x-codai-device: 497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{ "attempt": 1, "ok": true}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "schedule_id": "8929bb67-0da1-406c-99d2-5447376a4f58", "scheduled_for": "2019-08-24T14:15:22Z", "state": "pending", "attempt": 0, "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "exit_code": 0, "cost_micro_usd": 0, "log_tail": "string", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "error": "string", "created_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128OK.
application/json- response
hosts*array<>curl -X GET 'https://ai.codai.ro/v1/scheduler/hosts'{ "hosts": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "platform": "string", "os": "string", "arch": "string", "host_kind": "string", "tags": [ "string" ], "capabilities": [ "string" ], "online": true, "last_seen_at": "2019-08-24T14:15:22Z", "app_version": "string" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringId-ul dispozitivului gazdă.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
name?stringlength <= 120tags?array<>items <= 16host_kind?string"pc""phone""watch""vm""cloud"os?string"windows""macos""linux""android""wearos""ios"arch?stringlength <= 20OK.
application/json- response
[key: string]?anycurl -X PATCH 'https://ai.codai.ro/v1/scheduler/hosts/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128x-codai-device*stringUUID stabil al dispozitivului. Înregistrează dispozitivul la prima folosire (nume/platformă din x-codai-device-name / x-codai-device-platform) și selectează protocolul de sesiuni partajate.
uuidOK.
application/json- response
run*O execuție a unei programări.
schedule*O sarcină programată.
host_approved*booleancurl -X POST 'https://ai.codai.ro/v1/scheduler/claim' \ -H 'x-codai-device: 497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "run": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "schedule_id": "8929bb67-0da1-406c-99d2-5447376a4f58", "scheduled_for": "2019-08-24T14:15:22Z", "state": "pending", "attempt": 0, "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "exit_code": 0, "cost_micro_usd": 0, "log_tail": "string", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "error": "string", "created_at": "2019-08-24T14:15:22Z" }, "schedule": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "description": "string", "enabled": true, "kind": "agent", "spec": {}, "trigger": {}, "target": {}, "failover": [ [ "string" ] ], "native": true, "policy": {}, "misfire": "skip", "misfire_window_min": 0, "overlap": "skip", "timeout_s": 0, "retries": 0, "retry_backoff_s": 0, "late_after_s": 0, "alert_on_fail": true, "template": "string", "command_hash": "string", "next_run_at": "2019-08-24T14:15:22Z", "last_run_at": "2019-08-24T14:15:22Z", "upcoming": [ "2019-08-24T14:15:22Z" ], "approvals": [ { "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "command_hash": "string", "approved_at": "2019-08-24T14:15:22Z" } ], "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" }, "host_approved": true}Prompturi în așteptare
Prompturi gata de lipit pe care agenții (sau tu) le lasă pentru un chat viitor — predări, continuări programate — cu mementouri și lansare dintr-un clic pe un dispozitiv.
Transcrieri
Înregistrezi ședințe și apeluri pe orice dispozitiv și primești o transcriere română/engleză cu vorbitori și marcaje de timp pe cuvânt, apoi un rezumat, idei cheie, acțiuni și prompturi pentru agenți gata de rulat.