@vibeframe/cli 0.112.0 → 0.112.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -104,4 +104,13 @@ export interface CreateBuildPlanOptions {
104
104
  composer?: string;
105
105
  force?: boolean;
106
106
  }
107
+ /**
108
+ * Honest per-image estimate for backdrop generation at 1536x1024.
109
+ * OpenAI GPT Image 1.5/2 (mid-2026 pricing): "standard" maps to the API's
110
+ * medium tier (~$0.04/image) and "hd" to high (~$0.13–0.17/image); values
111
+ * below add ~20% headroom for retries. The previous flat $3/image
112
+ * overstated real spend 15–70x and scared users away from backdrops
113
+ * (e.g. 7 beats quoted as ~$21 when the real cost is ~$0.35–1.40).
114
+ */
115
+ export declare function backdropCostUsd(quality: "standard" | "hd"): number;
107
116
  export declare function createBuildPlan(opts: CreateBuildPlanOptions): Promise<BuildPlanResult>;
package/dist/index.js CHANGED
@@ -59515,6 +59515,9 @@ var init_build_backdrop_prompt = __esm({
59515
59515
  import { existsSync as existsSync47 } from "node:fs";
59516
59516
  import { readFile as readFile43 } from "node:fs/promises";
59517
59517
  import { dirname as dirname21, join as join23, resolve as resolve60 } from "node:path";
59518
+ function backdropCostUsd(quality) {
59519
+ return quality === "hd" ? 0.2 : 0.05;
59520
+ }
59518
59521
  async function createBuildPlan(opts) {
59519
59522
  const projectDir = resolve60(opts.projectDir);
59520
59523
  loadPlanEnv(projectDir);
@@ -59670,7 +59673,7 @@ async function createBuildPlan(opts) {
59670
59673
  reference: backdropReference,
59671
59674
  projectDir,
59672
59675
  force: opts.force,
59673
- cost: BACKDROP_COST_USD,
59676
+ cost: backdropCostUsd(imageQuality),
59674
59677
  active: includeAssets
59675
59678
  }) : null;
59676
59679
  const video = videoCue && !opts.skipVideo ? assetPlan({
@@ -60146,7 +60149,7 @@ function loadPlanEnv(projectDir) {
60146
60149
  dir = dirname21(dir);
60147
60150
  }
60148
60151
  }
60149
- var import_dotenv3, BACKDROP_COST_USD, VIDEO_COST_USD, MUSIC_COST_USD, ELEVENLABS_NARRATION_COST_USD, COMPOSE_COST_USD, SUPPORTED_BUILD_IMAGE_PROVIDERS;
60152
+ var import_dotenv3, VIDEO_COST_USD, MUSIC_COST_USD, ELEVENLABS_NARRATION_COST_USD, COMPOSE_COST_USD, SUPPORTED_BUILD_IMAGE_PROVIDERS;
60150
60153
  var init_build_plan = __esm({
60151
60154
  "src/commands/_shared/build-plan.ts"() {
60152
60155
  "use strict";
@@ -60161,7 +60164,6 @@ var init_build_plan = __esm({
60161
60164
  init_storyboard_parse();
60162
60165
  init_project_config();
60163
60166
  init_storyboard_edit();
60164
- BACKDROP_COST_USD = 3;
60165
60167
  VIDEO_COST_USD = 5;
60166
60168
  MUSIC_COST_USD = 0.5;
60167
60169
  ELEVENLABS_NARRATION_COST_USD = 0.05;
@@ -61177,7 +61179,10 @@ async function executeSceneBuild(opts) {
61177
61179
  (beat) => beat.narrationStatus === "failed" || beat.backdropStatus === "failed" || beat.videoStatus === "failed" || beat.musicStatus === "failed"
61178
61180
  );
61179
61181
  stageReports.assets.status = assetFailed ? "failed" : pendingJobs.length > 0 ? "pending-jobs" : "done";
61180
- stageReports.assets.costUsd = estimateActualAssetCost(beatOutcomes);
61182
+ stageReports.assets.costUsd = estimateActualAssetCost(
61183
+ beatOutcomes,
61184
+ opts.imageQuality ?? "hd"
61185
+ );
61181
61186
  stageReports.assets.retryWith = pendingJobs.map(
61182
61187
  (job) => `vibe status job ${job.id} --project ${projectDir} --json`
61183
61188
  );
@@ -62360,11 +62365,11 @@ function shouldRunStage(selected, stage) {
62360
62365
  if (selected === "all") return true;
62361
62366
  return selected === stage;
62362
62367
  }
62363
- function estimateActualAssetCost(outcomes) {
62368
+ function estimateActualAssetCost(outcomes, imageQuality) {
62364
62369
  let cost = 0;
62365
62370
  for (const outcome of outcomes) {
62366
62371
  if (outcome.narrationStatus === "generated") cost += 0.05;
62367
- if (outcome.backdropStatus === "generated") cost += 3;
62372
+ if (outcome.backdropStatus === "generated") cost += backdropCostUsd(imageQuality);
62368
62373
  if (outcome.videoStatus === "generated" || outcome.videoStatus === "pending") cost += 5;
62369
62374
  if (outcome.musicStatus === "generated" || outcome.musicStatus === "pending") cost += 0.5;
62370
62375
  }
@@ -73431,7 +73436,7 @@ init_source();
73431
73436
  // package.json
73432
73437
  var package_default = {
73433
73438
  name: "@vibeframe/cli",
73434
- version: "0.112.0",
73439
+ version: "0.112.1",
73435
73440
  description: "VibeFrame CLI - agentic video workflow runtime",
73436
73441
  private: false,
73437
73442
  license: "MIT",
@@ -32697,6 +32697,9 @@ var init_storyboard_edit = __esm({
32697
32697
  import { existsSync as existsSync17 } from "node:fs";
32698
32698
  import { readFile as readFile17 } from "node:fs/promises";
32699
32699
  import { dirname as dirname9, join as join15, resolve as resolve22 } from "node:path";
32700
+ function backdropCostUsd(quality) {
32701
+ return quality === "hd" ? 0.2 : 0.05;
32702
+ }
32700
32703
  async function createBuildPlan(opts) {
32701
32704
  const projectDir = resolve22(opts.projectDir);
32702
32705
  loadPlanEnv(projectDir);
@@ -32852,7 +32855,7 @@ async function createBuildPlan(opts) {
32852
32855
  reference: backdropReference,
32853
32856
  projectDir,
32854
32857
  force: opts.force,
32855
- cost: BACKDROP_COST_USD,
32858
+ cost: backdropCostUsd(imageQuality),
32856
32859
  active: includeAssets
32857
32860
  }) : null;
32858
32861
  const video = videoCue && !opts.skipVideo ? assetPlan({
@@ -33328,7 +33331,7 @@ function loadPlanEnv(projectDir) {
33328
33331
  dir = dirname9(dir);
33329
33332
  }
33330
33333
  }
33331
- var import_dotenv2, BACKDROP_COST_USD, VIDEO_COST_USD, MUSIC_COST_USD, ELEVENLABS_NARRATION_COST_USD, COMPOSE_COST_USD, SUPPORTED_BUILD_IMAGE_PROVIDERS;
33334
+ var import_dotenv2, VIDEO_COST_USD, MUSIC_COST_USD, ELEVENLABS_NARRATION_COST_USD, COMPOSE_COST_USD, SUPPORTED_BUILD_IMAGE_PROVIDERS;
33332
33335
  var init_build_plan = __esm({
33333
33336
  "src/commands/_shared/build-plan.ts"() {
33334
33337
  "use strict";
@@ -33343,7 +33346,6 @@ var init_build_plan = __esm({
33343
33346
  init_storyboard_parse();
33344
33347
  init_project_config();
33345
33348
  init_storyboard_edit();
33346
- BACKDROP_COST_USD = 3;
33347
33349
  VIDEO_COST_USD = 5;
33348
33350
  MUSIC_COST_USD = 0.5;
33349
33351
  ELEVENLABS_NARRATION_COST_USD = 0.05;
@@ -33864,7 +33866,10 @@ async function executeSceneBuild(opts) {
33864
33866
  (beat) => beat.narrationStatus === "failed" || beat.backdropStatus === "failed" || beat.videoStatus === "failed" || beat.musicStatus === "failed"
33865
33867
  );
33866
33868
  stageReports.assets.status = assetFailed ? "failed" : pendingJobs.length > 0 ? "pending-jobs" : "done";
33867
- stageReports.assets.costUsd = estimateActualAssetCost(beatOutcomes);
33869
+ stageReports.assets.costUsd = estimateActualAssetCost(
33870
+ beatOutcomes,
33871
+ opts.imageQuality ?? "hd"
33872
+ );
33868
33873
  stageReports.assets.retryWith = pendingJobs.map(
33869
33874
  (job) => `vibe status job ${job.id} --project ${projectDir} --json`
33870
33875
  );
@@ -35047,11 +35052,11 @@ function shouldRunStage(selected, stage) {
35047
35052
  if (selected === "all") return true;
35048
35053
  return selected === stage;
35049
35054
  }
35050
- function estimateActualAssetCost(outcomes) {
35055
+ function estimateActualAssetCost(outcomes, imageQuality) {
35051
35056
  let cost = 0;
35052
35057
  for (const outcome of outcomes) {
35053
35058
  if (outcome.narrationStatus === "generated") cost += 0.05;
35054
- if (outcome.backdropStatus === "generated") cost += 3;
35059
+ if (outcome.backdropStatus === "generated") cost += backdropCostUsd(imageQuality);
35055
35060
  if (outcome.videoStatus === "generated" || outcome.videoStatus === "pending") cost += 5;
35056
35061
  if (outcome.musicStatus === "generated" || outcome.musicStatus === "pending") cost += 0.5;
35057
35062
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.112.0",
3
+ "version": "0.112.1",
4
4
  "description": "VibeFrame CLI - agentic video workflow runtime",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -83,8 +83,8 @@
83
83
  "tsx": "^4.21.0",
84
84
  "typescript": "^5.3.3",
85
85
  "vitest": "^1.2.2",
86
- "@vibeframe/ai-providers": "0.112.0",
87
- "@vibeframe/core": "0.112.0"
86
+ "@vibeframe/ai-providers": "0.112.1",
87
+ "@vibeframe/core": "0.112.1"
88
88
  },
89
89
  "engines": {
90
90
  "node": ">=20"