wip: references

This commit is contained in:
2026-02-24 00:37:51 +07:00
parent 5a854479f9
commit d7fe0e037d
2 changed files with 73 additions and 10 deletions
+61 -5
View File
@@ -1,5 +1,5 @@
import { writeFileSync, mkdirSync, readFileSync } from 'fs';
import { resolve, dirname } from 'path';
import { writeFileSync, mkdirSync, readFileSync, existsSync } from 'fs';
import { resolve, dirname, basename } from 'path';
const envPath = resolve(dirname(new URL(import.meta.url).pathname), '../../.env');
try {
@@ -16,15 +16,67 @@ try {
const API_BASE = 'https://api.banatie.app/api/v1';
const API_KEY = process.env.BANATIE_KEY || '';
export async function generateImage({ prompt, output, aspectRatio = '1:1' }) {
async function uploadImage(filePath) {
const absolutePath = resolve(filePath);
const fileBuffer = readFileSync(absolutePath);
const fileName = basename(absolutePath);
const ext = fileName.split('.').pop().toLowerCase();
const mimeTypes = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', webp: 'image/webp' };
const mime = mimeTypes[ext] || 'application/octet-stream';
const form = new FormData();
form.append('file', new Blob([fileBuffer], { type: mime }), fileName);
console.log(`Uploading reference: ${filePath}...`);
const response = await fetch(`${API_BASE}/images/upload`, {
method: 'POST',
headers: { 'X-API-Key': API_KEY },
body: form,
});
if (!response.ok) {
const text = await response.text();
console.error(`Upload error ${response.status}: ${text}`);
process.exit(1);
}
const result = await response.json();
if (!result.success) {
console.error(`Upload failed:`, result.error);
process.exit(1);
}
console.log(`Uploaded: ${result.data.id}`);
return result.data.id;
}
async function resolveRefs(refs) {
if (!refs || refs.length === 0) return undefined;
const ids = [];
for (const ref of refs) {
if (existsSync(ref)) {
ids.push(await uploadImage(ref));
} else {
ids.push(ref);
}
}
return ids;
}
export async function generateImage({ prompt, output, aspectRatio = '1:1', refs }) {
if (!API_KEY) {
console.error('BANATIE_KEY environment variable is not set');
process.exit(1);
}
const referenceImages = await resolveRefs(refs);
const body = { prompt, aspectRatio };
if (referenceImages) body.referenceImages = referenceImages;
console.log(`Generating: "${prompt}" (${body.aspectRatio})...`);
console.log(`Generating: "${prompt}" (${body.aspectRatio})${referenceImages ? ` with ${referenceImages.length} ref(s)` : ''}...`);
const response = await fetch(`${API_BASE}/generations`, {
method: 'POST',
@@ -71,6 +123,10 @@ function parseArgs(args) {
if (args[i] === '--prompt') result.prompt = args[++i];
else if (args[i] === '--output') result.output = args[++i];
else if (args[i] === '--aspect-ratio') result.aspectRatio = args[++i];
else if (args[i] === '--ref') {
if (!result.refs) result.refs = [];
result.refs.push(args[++i]);
}
}
return result;
}
@@ -79,6 +135,6 @@ const args = parseArgs(process.argv.slice(2));
if (args.prompt && args.output) {
generateImage(args);
} else if (process.argv.length > 2) {
console.error('Usage: node banatie.mjs --prompt "<description>" --output <path> [--aspect-ratio <ratio>]');
console.error('Usage: node banatie.mjs --prompt "<description>" --output <path> [--aspect-ratio <ratio>] [--ref <file|id>]...');
process.exit(1);
}