24 lines
1.5 KiB
JavaScript
24 lines
1.5 KiB
JavaScript
import {accountRequest} from './accountRequest.js';
|
||
import {awaitWithAbort} from './abortable.js';
|
||
export const listAiJobs=ikn=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams(ikn?{ikn}:{}));
|
||
export const getAiJob=id=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({id}));
|
||
export const cancelAiJob=id=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({id}),{method:'DELETE'});
|
||
export const retryAiJob=id=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({id}),{method:'POST',body:JSON.stringify({action:'retry'})});
|
||
export async function runDurableAiJob(operation,input,{signal,check,onProgress=()=>{},request=accountRequest,pollMs=1500}={}) {
|
||
check();
|
||
const started=await request('/api/me/ai-jobs',{method:'POST',signal,body:JSON.stringify({operation,input,requestId:crypto.randomUUID()})});
|
||
let job=started.job;
|
||
while(true) {
|
||
check();
|
||
if(!job || !['queued','running','completed','failed','interrupted','cancelled'].includes(job.state))throw new Error('AI iş durumu geçersiz. Kayıtlı işler bölümünden kontrol edin.');
|
||
onProgress(job);
|
||
if(job.state==='completed')return job.result;
|
||
if(['failed','interrupted','cancelled'].includes(job.state))throw new Error(job.error || 'AI işi iptal edildi.');
|
||
let timer;
|
||
try {await awaitWithAbort(new Promise(resolve=>{timer=setTimeout(resolve,pollMs);}),signal,()=>clearTimeout(timer));}
|
||
finally {clearTimeout(timer);}
|
||
check();
|
||
job=(await request('/api/me/ai-jobs?'+new URLSearchParams({id:job.id}),{signal})).job;
|
||
}
|
||
}
|