An elegant TypeScript/JavaScript SDK for interacting with the OOMOL Fusion API. A universal Fusion service client that supports calling any Fusion service. No manual polling required - the SDK handles all asynchronous operations internally.
- π Universal Service Support: Call any OOMOL Fusion service
- π Simple & Easy: Modern async/await API following JavaScript best practices
- π Auto Polling: No manual polling needed, SDK handles it internally
- π Real-time Progress: Progress callbacks to track task status
- π€ File Upload: Smart file upload with automatic multipart support for large files
- π― TypeScript Support: Full type definitions
- π‘οΈ Robust Error Handling: Multiple custom error types for precise error handling
- π§ Highly Configurable: Customize polling interval, timeout, and more
- π Environment Detection: Auto-detects runtime environment with compatibility warnings
- π§ͺ Test Coverage: Comprehensive test suite
npm install oomol-fusion-sdkimport OomolFusionSDK from 'oomol-fusion-sdk';
const sdk = new OomolFusionSDK({
token: process.env.OOMOL_TOKEN,
});
// Run a task and wait for the result
const result = await sdk.run({
service: 'fal-nano-banana-pro',
inputs: {
prompt: 'A cute little cat',
aspect_ratio: '1:1',
resolution: '2K'
}
});
console.log(result.data);const sdk = new OomolFusionSDK(options);Options:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
token |
string |
β | - | OOMOL authentication token |
baseUrl |
string |
β | https://fusion-api.oomol.com/v1 |
API base URL |
pollingInterval |
number |
β | 2000 |
Polling interval (milliseconds) |
timeout |
number |
β | 300000 |
Timeout (milliseconds, 5 minutes) |
Execute a task and wait for the result. This is the most commonly used method.
// Basic usage
const result = await sdk.run({
service: 'fal-nano-banana-pro',
inputs: {
prompt: 'A cute cat',
aspect_ratio: '1:1'
}
});
// With progress callback
const result = await sdk.run(
{
service: 'fal-nano-banana-pro',
inputs: { prompt: 'A cute cat' }
},
{
onProgress: (progress) => {
console.log(`Progress: ${progress}%`);
// Update your progress bar UI
}
}
);Submit a task without waiting for the result. Useful for batch submissions.
const { sessionID } = await sdk.submit({
service: 'fal-nano-banana-pro',
inputs: { prompt: 'A cute dog' }
});Wait for a specific task to complete. Use with submit().
const result = await sdk.waitFor('fal-nano-banana-pro', sessionID, {
onProgress: (progress) => console.log(`Progress: ${progress}%`)
});Upload files with automatic multipart support for large files (>5MB).
// Browser environment
const file = document.querySelector('input[type="file"]').files[0];
const downloadUrl = await sdk.uploadFile(file, {
onProgress: (progress) => {
if (typeof progress === 'number') {
console.log(`Upload progress: ${progress}%`);
} else {
console.log(`Uploaded: ${progress.uploadedChunks}/${progress.totalChunks} chunks`);
}
}
});
// Node.js environment
import fs from 'fs';
const fileBuffer = fs.readFileSync('image.jpg');
const downloadUrl = await sdk.uploadFile(fileBuffer, 'image.jpg');const sdk = new OomolFusionSDK({
token: process.env.OOMOL_TOKEN,
});
const result = await sdk.run({
service: 'fal-nano-banana-pro',
inputs: {
prompt: 'A cute little cat yawning in the sunlight',
aspect_ratio: '1:1',
resolution: '2K',
}
});
console.log(result.data);const result = await sdk.run(
{
service: 'fal-nano-banana-pro',
inputs: { prompt: 'A cute cat' }
},
{
onProgress: (progress) => {
console.log(`Current progress: ${progress}%`);
// Update UI, e.g., progress bar
updateProgressBar(progress);
}
}
);const prompts = ['A cute cat', 'A cute dog', 'A cute rabbit'];
// Submit all tasks in parallel
const submissions = await Promise.all(
prompts.map(prompt => sdk.submit({
service: 'fal-nano-banana-pro',
inputs: { prompt }
}))
);
// Wait for all results in parallel
const results = await Promise.all(
submissions.map(({ sessionID }) =>
sdk.waitFor('fal-nano-banana-pro', sessionID)
)
);// Browser environment - upload from file input
const fileInput = document.querySelector('input[type="file"]');
const file = fileInput.files[0];
const downloadUrl = await sdk.uploadFile(file, {
onProgress: (progress) => {
if (typeof progress === 'number') {
console.log(`Upload progress: ${progress}%`);
// Update progress bar
progressBar.value = progress;
} else {
console.log(`Uploaded ${progress.uploadedChunks}/${progress.totalChunks} chunks`);
console.log(`${(progress.uploadedBytes / 1024 / 1024).toFixed(2)}MB / ${(progress.totalBytes / 1024 / 1024).toFixed(2)}MB`);
}
}
});
console.log('File uploaded:', downloadUrl);
// Node.js environment - upload from file system
import fs from 'fs';
const fileBuffer = fs.readFileSync('./documents/report.pdf');
const downloadUrl = await sdk.uploadFile(fileBuffer, 'report.pdf', {
onProgress: (progress) => {
if (typeof progress === 'number') {
console.log(`Upload progress: ${progress}%`);
} else {
console.log(`Uploaded ${progress.uploadedChunks}/${progress.totalChunks} chunks`);
}
},
multipartThreshold: 10 * 1024 * 1024, // Use multipart for files > 10MB
maxConcurrentUploads: 5, // Upload 5 chunks concurrently
retries: 3 // Retry 3 times on failure
});
console.log('File uploaded:', downloadUrl);import {
TaskTimeoutError,
TaskFailedError,
FileUploadError,
FileTooLargeError
} from 'oomol-fusion-sdk';
try {
const result = await sdk.run({
service: 'fal-nano-banana-pro',
inputs: { prompt: 'Test' }
});
} catch (error) {
if (error instanceof TaskTimeoutError) {
console.error('Task timed out');
} else if (error instanceof TaskFailedError) {
console.error('Task failed:', error.message);
}
}
// File upload error handling
try {
const downloadUrl = await sdk.uploadFile(largeFile, 'large-file.zip');
} catch (error) {
if (error instanceof FileTooLargeError) {
console.error('File is too large:', error.message);
console.error(`File size: ${error.fileSize}, Max: ${error.maxSize}`);
} else if (error instanceof FileUploadError) {
console.error('Upload failed:', error.message);
}
}interface MyServiceData {
images: { url: string }[];
}
const result = await sdk.run<MyServiceData>({
service: 'fal-nano-banana-pro',
inputs: { prompt: 'A cat' }
});
// result.data.images now has full type hintsThe SDK provides a complete error type system:
TaskSubmitError- Task submission failedTaskTimeoutError- Task timed outTaskFailedError- Task execution failedNetworkError- Network request failedFileUploadError- File upload failedFileTooLargeError- File size exceeds limit (max 500MB)
How to get a Token? Visit OOMOL Website to register and obtain an API Token.
How to handle timeouts?
Set the timeout option (in milliseconds) in the constructor.
Can I process multiple tasks in parallel?
Yes, use Promise.all with submit() and waitFor().
MIT