// Example: Robust pipeline execution with proper error handling
class PipelineExecutor {
constructor(baseUrl, accessToken) {
this.baseUrl = baseUrl;
this.accessToken = accessToken;
this.headers = {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
};
}
async createAndExecutePipeline(config) {
try {
// Create pipeline
const createResponse = await fetch(`${this.baseUrl}/pipelines`, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(config)
});
if (!createResponse.ok) {
throw new Error(`Pipeline creation failed: ${createResponse.statusText}`);
}
const { pipelineId } = await createResponse.json();
// Execute pipeline
const executeResponse = await fetch(`${this.baseUrl}/pipelines/${pipelineId}/execute`, {
method: 'POST',
headers: this.headers
});
if (!executeResponse.ok) {
throw new Error(`Pipeline execution failed: ${executeResponse.statusText}`);
}
const { jobId } = await executeResponse.json();
// Poll for completion
return await this.pollExecution(jobId);
} catch (error) {
console.error('Pipeline execution error:', error);
throw error;
}
}
async pollExecution(jobId, maxAttempts = 60) {
let attempts = 0;
const pollInterval = 30000; // 30 seconds
while (attempts < maxAttempts) {
try {
const response = await fetch(`${this.baseUrl}/pipelines/job/${jobId}`, {
method: 'POST',
headers: this.headers
});
const jobStatus = await response.json();
if (jobStatus.status === 'completed') {
return jobStatus;
} else if (jobStatus.status === 'failed') {
throw new Error(`Pipeline failed: ${jobStatus.error.message}`);
}
console.log(`Pipeline progress: ${jobStatus.progress}%`);
await new Promise(resolve => setTimeout(resolve, pollInterval));
attempts++;
} catch (error) {
console.error(`Polling attempt ${attempts} failed:`, error);
if (attempts >= maxAttempts) throw error;
await new Promise(resolve => setTimeout(resolve, 5000));
}
}
throw new Error('Pipeline execution timeout');
}
}
// Usage
const executor = new PipelineExecutor("https://api.artosai.com", "your-token");
const pipelineConfig = {
name: "Clinical Report Generator",
agentIds: ["extract-data", "analyze-results", "format-report"],
documents: ["protocol-001", "results-002"],
connectorId: "batch-001",
referenceDocument: "fda-template",
outputFileName: "clinical-report.docx"
};
executor.createAndExecutePipeline(pipelineConfig)
.then(result => {
console.log('Pipeline completed:', result.output_url);
})
.catch(error => {
console.error('Pipeline failed:', error);
});