Bot & Automation

AI Creator Studio Telegram

/root/hermes-projects/AI Creator Studio Telegram

packages/core/src/estimator.ts text
import type { GenerationEstimateInput, ResourceEstimate } from "./types.js";

const modeBaseCost: Record<string, number> = {
  text_to_image: 20,
  image_to_image: 30,
  upscale_image: 18,
  remove_background: 8,
  replace_background: 16,
  style_transfer: 28,
  enhance_image: 14,
  text_to_video: 100,
  image_to_video: 120,
  enhance_video: 80,
  upscale_video: 90,
  frame_interpolation: 75,
  motion_enhancement: 85,
};

const qualityMultiplier: Record<string, number> = {
  Standard: 1,
  High: 1.35,
  Ultra: 1.9,
};

const resolutionMultiplier: Record<string, number> = {
  HD: 1,
  "Full HD": 1.25,
  "720p": 1,
  "1080p": 1.35,
  "2K": 1.75,
  "4K": 2.6,
};

const durationMultiplier: Record<string, number> = {
  "5s": 1,
  "8s": 1.45,
  "10s": 1.8,
  "15s": 2.55,
  "30s": 5,
  "60s": 9.5,
};

export function buildResourceEstimate(input: GenerationEstimateInput): ResourceEstimate {
  const settings = input.settings ?? {};
  const base = modeBaseCost[input.mode] ?? 20;
  const quality = qualityMultiplier[String(settings.quality ?? "High")] ?? 1.35;
  const resolution = resolutionMultiplier[String(settings.resolution ?? "Full HD")] ?? 1.25;
  const duration = input.mode.includes("video")
    ? durationMultiplier[String(settings.duration ?? "8s")] ?? 1.45
    : 1;
  const fps = Number(settings.fps ?? 24);
  const fpsMultiplier = fps >= 60 ? 1.4 : fps >= 30 ? 1.15 : 1;

  const credits = Math.ceil(base * quality * resolution * duration * fpsMultiplier);
  const tokens = Math.ceil(input.prompt.length * 3.5 + credits * 12);
  const storageBytes = Math.ceil((input.mode.includes("video") ? 18_000_000 : 4_000_000) * duration * resolution);

  return {
    credits,
    tokens,
    storageBytes,
    etaSecondsMin: input.mode.includes("video") ? 120 : 20,
    etaSecondsMax: input.mode.includes("video") ? 420 : 90,
  };
}