Files
vision-server/db/models.js
khalid@traclabs.com 62e5e309ad Add cropping
2026-04-30 15:30:52 -05:00

82 lines
2.1 KiB
JavaScript

import { Sequelize, DataTypes } from 'sequelize';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
const __dirname = dirname(fileURLToPath(import.meta.url));
export const sequelize = new Sequelize({
dialect: 'sqlite',
storage: join(__dirname, '../data/jobs.sqlite'),
logging: false,
});
export const Job = sequelize.define('Job', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
},
prompt: {
type: DataTypes.TEXT,
allowNull: false,
},
// Base64 data URL stored for replay; in production use object storage
imageDataUrl: {
type: DataTypes.TEXT,
allowNull: false,
},
imageMimeType: {
type: DataTypes.STRING(64),
allowNull: false,
defaultValue: 'image/jpeg',
},
status: {
// queued | running | done | error
type: DataTypes.STRING(16),
allowNull: false,
defaultValue: 'queued',
},
result: {
type: DataTypes.TEXT,
allowNull: true,
},
errorMessage: {
type: DataTypes.TEXT,
allowNull: true,
},
model: {
type: DataTypes.STRING(128),
allowNull: false,
defaultValue: 'qwen3.5:397b-cloud',
},
inputTokens: { type: DataTypes.INTEGER, allowNull: true },
outputTokens: { type: DataTypes.INTEGER, allowNull: true },
// ---- Bounding-box detection fields (Pass 1) ----
detectedSubject: {
type: DataTypes.STRING(256),
allowNull: true,
comment: 'Short description of what the LLM identified as the subject',
},
bboxX: { type: DataTypes.FLOAT, allowNull: true },
bboxY: { type: DataTypes.FLOAT, allowNull: true },
bboxWidth: { type: DataTypes.FLOAT, allowNull: true },
bboxHeight: { type: DataTypes.FLOAT, allowNull: true },
// Cropped image data URL (stored for UI preview / debugging)
croppedImageDataUrl: {
type: DataTypes.TEXT,
allowNull: true,
},
}, {
tableName: 'jobs',
timestamps: true,
});
export async function initDb() {
const { mkdirSync } = await import('fs');
mkdirSync(join(__dirname, '../data'), { recursive: true });
// alter: true adds new columns to an existing table without dropping data
await sequelize.sync({ alter: true });
}