@brotu/ai 0.5.0 → 0.6.0
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.
- package/CATALOG.md +298 -4
- package/README.md +5 -4
- package/dist/adapters/topaz.adapter.d.ts +71 -0
- package/dist/adapters/topaz.adapter.d.ts.map +1 -0
- package/dist/catalog.cjs +102 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +1 -1
- package/dist/{chunk-3MC3RDAJ.js → chunk-QQIHMDJC.js} +107 -2
- package/dist/client.d.ts +12 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/index.cjs +674 -32
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +544 -4
- package/dist/ports/content-generator.port.d.ts +12 -0
- package/dist/ports/content-generator.port.d.ts.map +1 -1
- package/dist/providers/topaz.models.d.ts +24 -0
- package/dist/providers/topaz.models.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export type { OpenAIAdapterOptions } from "./adapters/openai.adapter";
|
|
|
12
12
|
export { OpenAIAdapter } from "./adapters/openai.adapter";
|
|
13
13
|
export type { QwenAdapterOptions } from "./adapters/qwen.adapter";
|
|
14
14
|
export { QwenAdapter } from "./adapters/qwen.adapter";
|
|
15
|
+
export type { TopazAdapterOptions } from "./adapters/topaz.adapter";
|
|
16
|
+
export { TopazAdapter } from "./adapters/topaz.adapter";
|
|
15
17
|
export type { ModelAvailability } from "./catalog";
|
|
16
18
|
export { BROTU_SUPPORTED_CATEGORIES, DEFAULT_BROTU_API_URL, describeModels, getAvailableModels, getModel, getModels, getProviders, hasModel, registerModels, resetCatalog, resolveProvider, } from "./catalog";
|
|
17
19
|
export type { BrotuAI } from "./client";
|
|
@@ -30,5 +32,6 @@ export type { KlingModelBinding } from "./providers/kling.models";
|
|
|
30
32
|
export { type AvatarInput, type ImageOmniInput, KLING_CAPABILITIES, KLING_CATALOG, KLING_MODELS, type KlingCapability, type KlingRequestOptions, type KlingResultField, type MotionControlInput, type OmniVideoInput, type OutpaintingInput, } from "./providers/kling.models";
|
|
31
33
|
export { OPENAI_CATALOG, OPENAI_IMAGE_MODELS, OPENAI_TEXT_MODELS, } from "./providers/openai.models";
|
|
32
34
|
export { QWEN_AUDIO_MODELS, QWEN_CATALOG, QWEN_IMAGE_MODELS, QWEN_TEXT_MODELS, QWEN_VIDEO_MODELS, type QwenImageBinding, type QwenVideoBinding, } from "./providers/qwen.models";
|
|
35
|
+
export { TOPAZ_CATALOG, TOPAZ_IMAGE_MODELS, TOPAZ_MODELS, TOPAZ_VIDEO_MODELS, type TopazBinding, type TopazFilterKind, type TopazSurface, } from "./providers/topaz.models";
|
|
33
36
|
export type { BrotuAIOptions, ProviderConfig, ReferenceVideoInfo, ResolvedProvider, } from "./types";
|
|
34
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EACX,wBAAwB,EACxB,eAAe,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACN,0BAA0B,EAC1B,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,mBAAmB,yBAAyB,CAAC;AAC7C,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,IAAI,EACJ,KAAK,UAAU,EACf,EAAE,EACF,KAAK,MAAM,GACX,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,SAAS,EACT,MAAM,EACN,KAAK,EACL,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,YAAY,EACZ,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,UAAU,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,eAAe,EACf,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,OAAO,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,cAAc,EACd,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACrB,MAAM,eAAe,CAAC;AACvB,mBAAmB,gCAAgC,CAAC;AACpD,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,KAAK,oBAAoB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,GACjB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACX,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,10 @@ import {
|
|
|
27
27
|
QWEN_IMAGE_PATHS,
|
|
28
28
|
QWEN_TEXT_MODELS,
|
|
29
29
|
QWEN_VIDEO_MODELS,
|
|
30
|
+
TOPAZ_CATALOG,
|
|
31
|
+
TOPAZ_IMAGE_MODELS,
|
|
32
|
+
TOPAZ_MODELS,
|
|
33
|
+
TOPAZ_VIDEO_MODELS,
|
|
30
34
|
describeModels,
|
|
31
35
|
fieldsFor,
|
|
32
36
|
getAvailableModels,
|
|
@@ -38,7 +42,7 @@ import {
|
|
|
38
42
|
resetCatalog,
|
|
39
43
|
resolveProvider,
|
|
40
44
|
videoPathFor
|
|
41
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-QQIHMDJC.js";
|
|
42
46
|
|
|
43
47
|
// src/lib/jobs.ts
|
|
44
48
|
import { AsyncLocalStorage } from "async_hooks";
|
|
@@ -2425,6 +2429,475 @@ var QwenAdapter = class {
|
|
|
2425
2429
|
}
|
|
2426
2430
|
};
|
|
2427
2431
|
|
|
2432
|
+
// src/adapters/topaz.adapter.ts
|
|
2433
|
+
var DEFAULT_BASE_URL7 = "https://api.topazlabs.com";
|
|
2434
|
+
var POLL_INTERVAL_MS6 = 5e3;
|
|
2435
|
+
var DEFAULT_MAX_POLL_ATTEMPTS6 = 240;
|
|
2436
|
+
var DEFAULT_FPS = 30;
|
|
2437
|
+
var PIXELS = {
|
|
2438
|
+
"720p": { width: 1280, height: 720 },
|
|
2439
|
+
"720P": { width: 1280, height: 720 },
|
|
2440
|
+
"1080p": { width: 1920, height: 1080 },
|
|
2441
|
+
"1080P": { width: 1920, height: 1080 },
|
|
2442
|
+
"4k": { width: 3840, height: 2160 },
|
|
2443
|
+
"4K": { width: 3840, height: 2160 },
|
|
2444
|
+
"1K": { width: 1024, height: 1024 },
|
|
2445
|
+
"2K": { width: 2048, height: 2048 }
|
|
2446
|
+
};
|
|
2447
|
+
var TopazAdapter = class {
|
|
2448
|
+
providerName = "topaz";
|
|
2449
|
+
supportedTypes = ["video", "image"];
|
|
2450
|
+
opts;
|
|
2451
|
+
constructor(opts) {
|
|
2452
|
+
this.opts = opts;
|
|
2453
|
+
}
|
|
2454
|
+
get baseUrl() {
|
|
2455
|
+
return (this.opts.baseUrl ?? DEFAULT_BASE_URL7).replace(/\/$/, "");
|
|
2456
|
+
}
|
|
2457
|
+
get headers() {
|
|
2458
|
+
return {
|
|
2459
|
+
"X-API-Key": this.opts.apiKey,
|
|
2460
|
+
accept: "application/json",
|
|
2461
|
+
"Content-Type": "application/json"
|
|
2462
|
+
};
|
|
2463
|
+
}
|
|
2464
|
+
binding(modelId) {
|
|
2465
|
+
const id = modelId ?? "";
|
|
2466
|
+
const found = TOPAZ_MODELS[id];
|
|
2467
|
+
if (!found) {
|
|
2468
|
+
throw new Error(
|
|
2469
|
+
`"${id}" is not a Topaz model. Known: ${TOPAZ_CATALOG.map((model) => model.id).join(", ")}.`
|
|
2470
|
+
);
|
|
2471
|
+
}
|
|
2472
|
+
return [id, found];
|
|
2473
|
+
}
|
|
2474
|
+
/** 720p / 1080p / 4k, or an explicit "1920x1080" / "1920*1080" pair. */
|
|
2475
|
+
resolutionOf(resolution) {
|
|
2476
|
+
if (!resolution) return PIXELS["1080p"];
|
|
2477
|
+
const named = PIXELS[resolution];
|
|
2478
|
+
if (named) return named;
|
|
2479
|
+
const match = /^(\d{2,5})[x*](\d{2,5})$/i.exec(resolution.trim());
|
|
2480
|
+
if (match?.[1] && match[2]) {
|
|
2481
|
+
return { width: Number(match[1]), height: Number(match[2]) };
|
|
2482
|
+
}
|
|
2483
|
+
throw new Error(
|
|
2484
|
+
`Topaz wants 720p, 1080p, 4k or WxH, not "${resolution}".`
|
|
2485
|
+
);
|
|
2486
|
+
}
|
|
2487
|
+
containerOf(url) {
|
|
2488
|
+
const path = url.split("?")[0]?.toLowerCase() ?? "";
|
|
2489
|
+
if (path.endsWith(".mov")) return "mov";
|
|
2490
|
+
if (path.endsWith(".mkv")) return "mkv";
|
|
2491
|
+
return "mp4";
|
|
2492
|
+
}
|
|
2493
|
+
filterOf(binding, params) {
|
|
2494
|
+
const extras = params.providerOptions?.topaz ?? {};
|
|
2495
|
+
if (binding.kind === "upscale") {
|
|
2496
|
+
return { auto: "Auto", ...extras, model: binding.vendorModel };
|
|
2497
|
+
}
|
|
2498
|
+
const slowmo = numberish(extras.slowmo) ?? 1;
|
|
2499
|
+
const fps = numberish(extras.fps) ?? DEFAULT_FPS;
|
|
2500
|
+
if (slowmo < 1 || slowmo > 16) {
|
|
2501
|
+
throw new Error(`Topaz interpolation slowmo is 1\u201316, not ${slowmo}.`);
|
|
2502
|
+
}
|
|
2503
|
+
if (fps < 15 || fps > 240) {
|
|
2504
|
+
throw new Error(`Topaz interpolation fps is 15\u2013240, not ${fps}.`);
|
|
2505
|
+
}
|
|
2506
|
+
const filter = {
|
|
2507
|
+
model: binding.vendorModel,
|
|
2508
|
+
slowmo,
|
|
2509
|
+
fps
|
|
2510
|
+
};
|
|
2511
|
+
if (typeof extras.duplicate === "boolean") {
|
|
2512
|
+
filter.duplicate = extras.duplicate;
|
|
2513
|
+
}
|
|
2514
|
+
if (extras.duplicateThreshold !== void 0) {
|
|
2515
|
+
filter.duplicateThreshold = extras.duplicateThreshold;
|
|
2516
|
+
}
|
|
2517
|
+
return filter;
|
|
2518
|
+
}
|
|
2519
|
+
requestBody(binding, params, sourceUrl) {
|
|
2520
|
+
const extras = params.providerOptions?.topaz ?? {};
|
|
2521
|
+
const fps = numberish(extras.fps) ?? DEFAULT_FPS;
|
|
2522
|
+
return {
|
|
2523
|
+
source: { container: this.containerOf(sourceUrl) },
|
|
2524
|
+
filters: [this.filterOf(binding, params)],
|
|
2525
|
+
output: {
|
|
2526
|
+
resolution: this.resolutionOf(params.resolution),
|
|
2527
|
+
frameRate: fps,
|
|
2528
|
+
audioCodec: "AAC",
|
|
2529
|
+
audioTransfer: "Copy",
|
|
2530
|
+
dynamicCompressionLevel: "High",
|
|
2531
|
+
container: "mp4"
|
|
2532
|
+
}
|
|
2533
|
+
};
|
|
2534
|
+
}
|
|
2535
|
+
async request(path, init) {
|
|
2536
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
2537
|
+
method: init?.method ?? "GET",
|
|
2538
|
+
headers: this.headers,
|
|
2539
|
+
body: init?.body !== void 0 ? JSON.stringify(init.body) : void 0
|
|
2540
|
+
});
|
|
2541
|
+
const payload = await response.json();
|
|
2542
|
+
if (!response.ok) {
|
|
2543
|
+
throw new Error(
|
|
2544
|
+
payload.message ?? `Topaz returned ${response.status} for ${path}.`
|
|
2545
|
+
);
|
|
2546
|
+
}
|
|
2547
|
+
return payload;
|
|
2548
|
+
}
|
|
2549
|
+
async downloadSource(url) {
|
|
2550
|
+
const response = await fetch(url);
|
|
2551
|
+
if (!response.ok) {
|
|
2552
|
+
throw new Error(`Could not download the source video (${response.status}).`);
|
|
2553
|
+
}
|
|
2554
|
+
return {
|
|
2555
|
+
bytes: await response.arrayBuffer(),
|
|
2556
|
+
contentType: response.headers.get("content-type") ?? "video/mp4"
|
|
2557
|
+
};
|
|
2558
|
+
}
|
|
2559
|
+
async submitTask(params) {
|
|
2560
|
+
const [, binding] = this.binding(params.model);
|
|
2561
|
+
if (binding.surface !== "video") {
|
|
2562
|
+
throw new Error(
|
|
2563
|
+
`Topaz "${params.model}" is an image model. Use ai.image.`
|
|
2564
|
+
);
|
|
2565
|
+
}
|
|
2566
|
+
const sourceUrl = params.videoUrl ?? params.videoUrls?.[0];
|
|
2567
|
+
if (!sourceUrl) {
|
|
2568
|
+
throw new Error(
|
|
2569
|
+
`Topaz "${params.model}" needs a source video \u2014 pass videoUrl.`
|
|
2570
|
+
);
|
|
2571
|
+
}
|
|
2572
|
+
const source = await this.downloadSource(sourceUrl);
|
|
2573
|
+
const created = await this.request("/video/express", {
|
|
2574
|
+
method: "POST",
|
|
2575
|
+
body: this.requestBody(binding, params, sourceUrl)
|
|
2576
|
+
});
|
|
2577
|
+
const taskId = created.requestId?.trim();
|
|
2578
|
+
const uploadUrl = created.uploadUrls?.[0];
|
|
2579
|
+
if (!taskId || !uploadUrl) {
|
|
2580
|
+
throw new Error(
|
|
2581
|
+
"Topaz accepted the request but returned no request id or upload URL."
|
|
2582
|
+
);
|
|
2583
|
+
}
|
|
2584
|
+
const uploaded = await fetch(uploadUrl, {
|
|
2585
|
+
method: "PUT",
|
|
2586
|
+
headers: { "Content-Type": source.contentType },
|
|
2587
|
+
body: source.bytes
|
|
2588
|
+
});
|
|
2589
|
+
if (!uploaded.ok) {
|
|
2590
|
+
throw new Error(`Topaz upload failed (${uploaded.status}).`);
|
|
2591
|
+
}
|
|
2592
|
+
return { taskId, pollEndpoint: `/video/${taskId}/status` };
|
|
2593
|
+
}
|
|
2594
|
+
outputsFrom(payload, job) {
|
|
2595
|
+
const url = payload.download?.url;
|
|
2596
|
+
if (!url) return [];
|
|
2597
|
+
const expiresAtMs = payload.download?.expiresAt;
|
|
2598
|
+
return [
|
|
2599
|
+
{
|
|
2600
|
+
url,
|
|
2601
|
+
mimeType: "video/mp4",
|
|
2602
|
+
taskId: job.id,
|
|
2603
|
+
expiresAt: expiresAtMs ? new Date(expiresAtMs).toISOString() : expiresInHours(24),
|
|
2604
|
+
raw: {
|
|
2605
|
+
status: payload.status,
|
|
2606
|
+
progress: payload.progress,
|
|
2607
|
+
estimates: payload.estimates,
|
|
2608
|
+
outputSize: payload.outputSize
|
|
2609
|
+
}
|
|
2610
|
+
}
|
|
2611
|
+
];
|
|
2612
|
+
}
|
|
2613
|
+
snapshot(payload, job) {
|
|
2614
|
+
const raw = (payload.status ?? "").toLowerCase();
|
|
2615
|
+
if (raw === "failed" || raw === "canceled") {
|
|
2616
|
+
return {
|
|
2617
|
+
status: "failed",
|
|
2618
|
+
error: payload.message ?? `Topaz request ${raw}.`
|
|
2619
|
+
};
|
|
2620
|
+
}
|
|
2621
|
+
if (raw !== "complete") return { status: "pending" };
|
|
2622
|
+
const outputs = this.outputsFrom(payload, job);
|
|
2623
|
+
if (outputs.length === 0) return { status: "pending" };
|
|
2624
|
+
return {
|
|
2625
|
+
status: "succeeded",
|
|
2626
|
+
result: {
|
|
2627
|
+
success: true,
|
|
2628
|
+
outputs,
|
|
2629
|
+
creditsUsed: 0,
|
|
2630
|
+
provider: this.providerName,
|
|
2631
|
+
model: job.model,
|
|
2632
|
+
processingTimeMs: 0
|
|
2633
|
+
}
|
|
2634
|
+
};
|
|
2635
|
+
}
|
|
2636
|
+
async run(params) {
|
|
2637
|
+
const startedAt = Date.now();
|
|
2638
|
+
let modelId = params.model ?? "(none)";
|
|
2639
|
+
const failure = (error) => ({
|
|
2640
|
+
success: false,
|
|
2641
|
+
outputs: [],
|
|
2642
|
+
creditsUsed: 0,
|
|
2643
|
+
provider: this.providerName,
|
|
2644
|
+
model: modelId,
|
|
2645
|
+
processingTimeMs: Date.now() - startedAt,
|
|
2646
|
+
error
|
|
2647
|
+
});
|
|
2648
|
+
let submitted;
|
|
2649
|
+
try {
|
|
2650
|
+
modelId = this.binding(params.model)[0];
|
|
2651
|
+
submitted = await this.submitTask(params);
|
|
2652
|
+
} catch (error) {
|
|
2653
|
+
if (isPendingJob(error)) throw error;
|
|
2654
|
+
return failure(error instanceof Error ? error.message : String(error));
|
|
2655
|
+
}
|
|
2656
|
+
if (isSubmitMode()) {
|
|
2657
|
+
throw new PendingJob(submitted.taskId, submitted.pollEndpoint);
|
|
2658
|
+
}
|
|
2659
|
+
const job = {
|
|
2660
|
+
id: submitted.taskId,
|
|
2661
|
+
provider: this.providerName,
|
|
2662
|
+
model: modelId,
|
|
2663
|
+
kind: "video",
|
|
2664
|
+
pollEndpoint: submitted.pollEndpoint,
|
|
2665
|
+
params,
|
|
2666
|
+
submittedAt: new Date(startedAt).toISOString()
|
|
2667
|
+
};
|
|
2668
|
+
const maxAttempts = this.opts.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS6;
|
|
2669
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
2670
|
+
const snapshot = await this.completeJob(job);
|
|
2671
|
+
if (snapshot.status === "failed") {
|
|
2672
|
+
return failure(snapshot.error ?? "Topaz request failed.");
|
|
2673
|
+
}
|
|
2674
|
+
if (snapshot.status === "succeeded" && snapshot.result) {
|
|
2675
|
+
return { ...snapshot.result, processingTimeMs: Date.now() - startedAt };
|
|
2676
|
+
}
|
|
2677
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS6));
|
|
2678
|
+
}
|
|
2679
|
+
return failure(
|
|
2680
|
+
`Topaz request ${submitted.taskId} did not finish after ${maxAttempts} checks.`
|
|
2681
|
+
);
|
|
2682
|
+
}
|
|
2683
|
+
async completeJob(job) {
|
|
2684
|
+
try {
|
|
2685
|
+
if (job.pollEndpoint?.startsWith("/image/")) {
|
|
2686
|
+
return this.imageSnapshot(job);
|
|
2687
|
+
}
|
|
2688
|
+
const payload = await this.request(
|
|
2689
|
+
job.pollEndpoint ?? `/video/${job.id}/status`
|
|
2690
|
+
);
|
|
2691
|
+
return this.snapshot(payload, job);
|
|
2692
|
+
} catch (error) {
|
|
2693
|
+
return {
|
|
2694
|
+
status: "failed",
|
|
2695
|
+
error: error instanceof Error ? error.message : String(error)
|
|
2696
|
+
};
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
generateVideo(params) {
|
|
2700
|
+
return this.run(params);
|
|
2701
|
+
}
|
|
2702
|
+
imageBody(binding, params, sourceUrl) {
|
|
2703
|
+
const extras = params.providerOptions?.topaz ?? {};
|
|
2704
|
+
const pixels = params.resolution ? this.resolutionOf(params.resolution) : void 0;
|
|
2705
|
+
const fields = {
|
|
2706
|
+
source_url: sourceUrl,
|
|
2707
|
+
model: binding.vendorModel,
|
|
2708
|
+
output_format: params.outputFormat === "png" ? "png" : params.outputFormat === "jpeg" ? "jpeg" : "jpeg"
|
|
2709
|
+
};
|
|
2710
|
+
if (pixels) {
|
|
2711
|
+
fields.output_width = String(pixels.width);
|
|
2712
|
+
fields.output_height = String(pixels.height);
|
|
2713
|
+
}
|
|
2714
|
+
for (const [key, value] of Object.entries(extras)) {
|
|
2715
|
+
if (value === void 0) continue;
|
|
2716
|
+
fields[key] = typeof value === "string" ? value : String(value);
|
|
2717
|
+
}
|
|
2718
|
+
return fields;
|
|
2719
|
+
}
|
|
2720
|
+
async submitImage(params) {
|
|
2721
|
+
const [, binding] = this.binding(params.model);
|
|
2722
|
+
if (binding.surface !== "image" || !binding.imagePath) {
|
|
2723
|
+
throw new Error(
|
|
2724
|
+
`Topaz "${params.model}" is a video model. Use ai.video with videoUrl.`
|
|
2725
|
+
);
|
|
2726
|
+
}
|
|
2727
|
+
const sourceUrl = params.referenceImages?.[0];
|
|
2728
|
+
if (!sourceUrl) {
|
|
2729
|
+
throw new Error(
|
|
2730
|
+
`Topaz "${params.model}" needs a source image \u2014 pass referenceImages.`
|
|
2731
|
+
);
|
|
2732
|
+
}
|
|
2733
|
+
const form = new FormData();
|
|
2734
|
+
for (const [key, value] of Object.entries(
|
|
2735
|
+
this.imageBody(binding, params, sourceUrl)
|
|
2736
|
+
)) {
|
|
2737
|
+
form.set(key, value);
|
|
2738
|
+
}
|
|
2739
|
+
const response = await fetch(`${this.baseUrl}${binding.imagePath}`, {
|
|
2740
|
+
method: "POST",
|
|
2741
|
+
headers: {
|
|
2742
|
+
"X-API-Key": this.opts.apiKey,
|
|
2743
|
+
accept: "application/json"
|
|
2744
|
+
},
|
|
2745
|
+
body: form
|
|
2746
|
+
});
|
|
2747
|
+
const payload = await response.json();
|
|
2748
|
+
if (!response.ok) {
|
|
2749
|
+
throw new Error(
|
|
2750
|
+
payload.message ?? `Topaz returned ${response.status} enhancing the image.`
|
|
2751
|
+
);
|
|
2752
|
+
}
|
|
2753
|
+
const taskId = payload.process_id?.trim();
|
|
2754
|
+
if (!taskId) {
|
|
2755
|
+
throw new Error(
|
|
2756
|
+
"Topaz accepted the image but returned no process id."
|
|
2757
|
+
);
|
|
2758
|
+
}
|
|
2759
|
+
return { taskId, pollEndpoint: `/image/v1/status/${taskId}` };
|
|
2760
|
+
}
|
|
2761
|
+
async imageSnapshot(job) {
|
|
2762
|
+
const payload = await this.request(
|
|
2763
|
+
job.pollEndpoint ?? `/image/v1/status/${job.id}`
|
|
2764
|
+
);
|
|
2765
|
+
const raw = (payload.status ?? "").toLowerCase();
|
|
2766
|
+
if (raw === "failed" || raw === "cancelled") {
|
|
2767
|
+
return {
|
|
2768
|
+
status: "failed",
|
|
2769
|
+
error: `Topaz image ${raw}.`
|
|
2770
|
+
};
|
|
2771
|
+
}
|
|
2772
|
+
if (raw !== "completed") return { status: "pending" };
|
|
2773
|
+
let url = payload.download_url;
|
|
2774
|
+
let expiresAt = payload.eta ? new Date(payload.eta > 1e10 ? payload.eta : payload.eta * 1e3).toISOString() : void 0;
|
|
2775
|
+
if (!url) {
|
|
2776
|
+
const download = await this.request(
|
|
2777
|
+
`/image/v1/download/${job.id}`
|
|
2778
|
+
);
|
|
2779
|
+
url = download.download_url;
|
|
2780
|
+
if (download.expiry) {
|
|
2781
|
+
expiresAt = new Date(
|
|
2782
|
+
download.expiry > 1e10 ? download.expiry : download.expiry * 1e3
|
|
2783
|
+
).toISOString();
|
|
2784
|
+
}
|
|
2785
|
+
}
|
|
2786
|
+
if (!url) return { status: "pending" };
|
|
2787
|
+
return {
|
|
2788
|
+
status: "succeeded",
|
|
2789
|
+
result: {
|
|
2790
|
+
success: true,
|
|
2791
|
+
outputs: [
|
|
2792
|
+
{
|
|
2793
|
+
url,
|
|
2794
|
+
mimeType: "image/jpeg",
|
|
2795
|
+
taskId: job.id,
|
|
2796
|
+
expiresAt: expiresAt ?? expiresInHours(1),
|
|
2797
|
+
raw: {
|
|
2798
|
+
status: payload.status,
|
|
2799
|
+
progress: payload.progress,
|
|
2800
|
+
model: payload.model
|
|
2801
|
+
}
|
|
2802
|
+
}
|
|
2803
|
+
],
|
|
2804
|
+
creditsUsed: payload.credits ?? 0,
|
|
2805
|
+
provider: this.providerName,
|
|
2806
|
+
model: job.model,
|
|
2807
|
+
processingTimeMs: 0
|
|
2808
|
+
}
|
|
2809
|
+
};
|
|
2810
|
+
}
|
|
2811
|
+
async runImage(params) {
|
|
2812
|
+
const startedAt = Date.now();
|
|
2813
|
+
let modelId = params.model ?? "(none)";
|
|
2814
|
+
const failure = (error) => ({
|
|
2815
|
+
success: false,
|
|
2816
|
+
outputs: [],
|
|
2817
|
+
creditsUsed: 0,
|
|
2818
|
+
provider: this.providerName,
|
|
2819
|
+
model: modelId,
|
|
2820
|
+
processingTimeMs: Date.now() - startedAt,
|
|
2821
|
+
error
|
|
2822
|
+
});
|
|
2823
|
+
let submitted;
|
|
2824
|
+
try {
|
|
2825
|
+
modelId = this.binding(params.model)[0];
|
|
2826
|
+
submitted = await this.submitImage(params);
|
|
2827
|
+
} catch (error) {
|
|
2828
|
+
if (isPendingJob(error)) throw error;
|
|
2829
|
+
return failure(error instanceof Error ? error.message : String(error));
|
|
2830
|
+
}
|
|
2831
|
+
if (isSubmitMode()) {
|
|
2832
|
+
throw new PendingJob(submitted.taskId, submitted.pollEndpoint);
|
|
2833
|
+
}
|
|
2834
|
+
const job = {
|
|
2835
|
+
id: submitted.taskId,
|
|
2836
|
+
provider: this.providerName,
|
|
2837
|
+
model: modelId,
|
|
2838
|
+
kind: "image",
|
|
2839
|
+
pollEndpoint: submitted.pollEndpoint,
|
|
2840
|
+
params,
|
|
2841
|
+
submittedAt: new Date(startedAt).toISOString()
|
|
2842
|
+
};
|
|
2843
|
+
const maxAttempts = this.opts.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS6;
|
|
2844
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
2845
|
+
const snapshot = await this.completeJob(job);
|
|
2846
|
+
if (snapshot.status === "failed") {
|
|
2847
|
+
return failure(snapshot.error ?? "Topaz image failed.");
|
|
2848
|
+
}
|
|
2849
|
+
if (snapshot.status === "succeeded" && snapshot.result) {
|
|
2850
|
+
return { ...snapshot.result, processingTimeMs: Date.now() - startedAt };
|
|
2851
|
+
}
|
|
2852
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS6));
|
|
2853
|
+
}
|
|
2854
|
+
return failure(
|
|
2855
|
+
`Topaz image ${submitted.taskId} did not finish after ${maxAttempts} checks.`
|
|
2856
|
+
);
|
|
2857
|
+
}
|
|
2858
|
+
generateImage(params) {
|
|
2859
|
+
return this.runImage(params);
|
|
2860
|
+
}
|
|
2861
|
+
generateText(params) {
|
|
2862
|
+
return Promise.resolve(unsupported(this.providerName, params.model, "text"));
|
|
2863
|
+
}
|
|
2864
|
+
generateAudio(params) {
|
|
2865
|
+
return Promise.resolve(unsupported(this.providerName, params.model, "audio"));
|
|
2866
|
+
}
|
|
2867
|
+
estimateCost(type, params) {
|
|
2868
|
+
return Promise.resolve(estimateFor(this.providerName, type, params));
|
|
2869
|
+
}
|
|
2870
|
+
supportsModel(model) {
|
|
2871
|
+
return model in TOPAZ_MODELS;
|
|
2872
|
+
}
|
|
2873
|
+
getAvailableModels() {
|
|
2874
|
+
return TOPAZ_CATALOG.map((model) => ({
|
|
2875
|
+
id: model.id,
|
|
2876
|
+
name: model.name,
|
|
2877
|
+
type: model.category
|
|
2878
|
+
}));
|
|
2879
|
+
}
|
|
2880
|
+
};
|
|
2881
|
+
function numberish(value) {
|
|
2882
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
2883
|
+
if (typeof value === "string" && value.length > 0) {
|
|
2884
|
+
const parsed = Number(value);
|
|
2885
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
2886
|
+
}
|
|
2887
|
+
return void 0;
|
|
2888
|
+
}
|
|
2889
|
+
function unsupported(provider, model, kind) {
|
|
2890
|
+
return {
|
|
2891
|
+
success: false,
|
|
2892
|
+
outputs: [],
|
|
2893
|
+
creditsUsed: 0,
|
|
2894
|
+
provider,
|
|
2895
|
+
model: model ?? "",
|
|
2896
|
+
processingTimeMs: 0,
|
|
2897
|
+
error: `Topaz does not generate ${kind} on this adapter.`
|
|
2898
|
+
};
|
|
2899
|
+
}
|
|
2900
|
+
|
|
2428
2901
|
// src/helpers/result.ts
|
|
2429
2902
|
function ok(data) {
|
|
2430
2903
|
return { data, error: null };
|
|
@@ -2625,7 +3098,8 @@ var NATIVE_PROVIDERS = [
|
|
|
2625
3098
|
"google",
|
|
2626
3099
|
"kling",
|
|
2627
3100
|
"openai",
|
|
2628
|
-
"qwen"
|
|
3101
|
+
"qwen",
|
|
3102
|
+
"topaz"
|
|
2629
3103
|
];
|
|
2630
3104
|
function brotu(options) {
|
|
2631
3105
|
const apiKey = options.apiKey?.trim();
|
|
@@ -2724,6 +3198,12 @@ function brotu(options) {
|
|
|
2724
3198
|
baseUrl: provider.baseUrl
|
|
2725
3199
|
});
|
|
2726
3200
|
}
|
|
3201
|
+
if (provider.id === "topaz") {
|
|
3202
|
+
return new TopazAdapter({
|
|
3203
|
+
apiKey: provider.apiKey,
|
|
3204
|
+
baseUrl: provider.baseUrl
|
|
3205
|
+
});
|
|
3206
|
+
}
|
|
2727
3207
|
return void 0;
|
|
2728
3208
|
}
|
|
2729
3209
|
function generateWith(adapter, kind, params) {
|
|
@@ -3042,12 +3522,67 @@ function brotu(options) {
|
|
|
3042
3522
|
image: {
|
|
3043
3523
|
submit: (params) => submit("image", params),
|
|
3044
3524
|
generate: (params) => generate("image", params),
|
|
3045
|
-
list: () => listFor("image")
|
|
3525
|
+
list: () => listFor("image"),
|
|
3526
|
+
upscale: (params) => {
|
|
3527
|
+
if (!params.imageUrl?.trim()) {
|
|
3528
|
+
return Promise.resolve(
|
|
3529
|
+
fail({
|
|
3530
|
+
code: "invalid_request",
|
|
3531
|
+
message: "image.upscale needs imageUrl.",
|
|
3532
|
+
model: params.model
|
|
3533
|
+
})
|
|
3534
|
+
);
|
|
3535
|
+
}
|
|
3536
|
+
const model = getModel(params.model);
|
|
3537
|
+
if (model && !model.nodeTypes.includes("image_upscale")) {
|
|
3538
|
+
return Promise.resolve(
|
|
3539
|
+
fail({
|
|
3540
|
+
code: "invalid_request",
|
|
3541
|
+
message: `"${params.model}" is not an image upscale model.`,
|
|
3542
|
+
model: params.model
|
|
3543
|
+
})
|
|
3544
|
+
);
|
|
3545
|
+
}
|
|
3546
|
+
return generate("image", {
|
|
3547
|
+
...params,
|
|
3548
|
+
prompt: params.prompt ?? "",
|
|
3549
|
+
referenceImages: [
|
|
3550
|
+
params.imageUrl,
|
|
3551
|
+
...params.referenceImages ?? []
|
|
3552
|
+
]
|
|
3553
|
+
});
|
|
3554
|
+
}
|
|
3046
3555
|
},
|
|
3047
3556
|
video: {
|
|
3048
3557
|
submit: (params) => submit("video", params),
|
|
3049
3558
|
generate: (params) => generate("video", params),
|
|
3050
|
-
list: () => listFor("video")
|
|
3559
|
+
list: () => listFor("video"),
|
|
3560
|
+
upscale: (params) => {
|
|
3561
|
+
if (!params.videoUrl?.trim()) {
|
|
3562
|
+
return Promise.resolve(
|
|
3563
|
+
fail({
|
|
3564
|
+
code: "invalid_request",
|
|
3565
|
+
message: "video.upscale needs videoUrl.",
|
|
3566
|
+
model: params.model
|
|
3567
|
+
})
|
|
3568
|
+
);
|
|
3569
|
+
}
|
|
3570
|
+
const model = getModel(params.model);
|
|
3571
|
+
if (model && !model.nodeTypes.includes("video_upscale")) {
|
|
3572
|
+
return Promise.resolve(
|
|
3573
|
+
fail({
|
|
3574
|
+
code: "invalid_request",
|
|
3575
|
+
message: `"${params.model}" is not a video upscale model. Interpolation models use ai.video.submit.`,
|
|
3576
|
+
model: params.model
|
|
3577
|
+
})
|
|
3578
|
+
);
|
|
3579
|
+
}
|
|
3580
|
+
return submit("video", {
|
|
3581
|
+
...params,
|
|
3582
|
+
prompt: params.prompt ?? "",
|
|
3583
|
+
videoUrl: params.videoUrl
|
|
3584
|
+
});
|
|
3585
|
+
}
|
|
3051
3586
|
},
|
|
3052
3587
|
text: {
|
|
3053
3588
|
submit: (params) => submit("text", params),
|
|
@@ -3155,6 +3690,11 @@ export {
|
|
|
3155
3690
|
QWEN_TEXT_MODELS,
|
|
3156
3691
|
QWEN_VIDEO_MODELS,
|
|
3157
3692
|
QwenAdapter,
|
|
3693
|
+
TOPAZ_CATALOG,
|
|
3694
|
+
TOPAZ_IMAGE_MODELS,
|
|
3695
|
+
TOPAZ_MODELS,
|
|
3696
|
+
TOPAZ_VIDEO_MODELS,
|
|
3697
|
+
TopazAdapter,
|
|
3158
3698
|
brotu,
|
|
3159
3699
|
createS3Storage,
|
|
3160
3700
|
deliverWebhook,
|
|
@@ -88,6 +88,18 @@ export interface VideoGenerationParams extends CommonGenerationParams {
|
|
|
88
88
|
videoUrl?: string;
|
|
89
89
|
videoUrls?: string[];
|
|
90
90
|
}
|
|
91
|
+
/** `ai.video.upscale`. A source file, not a prompt. */
|
|
92
|
+
export interface VideoUpscaleParams extends Omit<VideoGenerationParams, "prompt" | "videoUrl"> {
|
|
93
|
+
model: string;
|
|
94
|
+
videoUrl: string;
|
|
95
|
+
prompt?: string;
|
|
96
|
+
}
|
|
97
|
+
/** `ai.image.upscale`. A source still, not a prompt. */
|
|
98
|
+
export interface ImageUpscaleParams extends Omit<ImageGenerationParams, "prompt"> {
|
|
99
|
+
model: string;
|
|
100
|
+
imageUrl: string;
|
|
101
|
+
prompt?: string;
|
|
102
|
+
}
|
|
91
103
|
export interface TextGenerationParams extends CommonGenerationParams {
|
|
92
104
|
systemPrompt?: string;
|
|
93
105
|
maxTokens?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-generator.port.d.ts","sourceRoot":"","sources":["../../src/ports/content-generator.port.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-generator.port.d.ts","sourceRoot":"","sources":["../../src/ports/content-generator.port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AIModelConfig } from "../constants/model.types";
|
|
2
|
+
/**
|
|
3
|
+
* Topaz Labs. Catalog ids are the vendor's own codes on video, and a
|
|
4
|
+
* kebab-case form of the image model name (the API still wants the spaced
|
|
5
|
+
* string in `vendorModel`).
|
|
6
|
+
*
|
|
7
|
+
* Video: POST /video/express. Image: POST /image/v1/<intent>/async.
|
|
8
|
+
*/
|
|
9
|
+
export type TopazSurface = "video" | "image";
|
|
10
|
+
export type TopazFilterKind = "interpolation" | "upscale";
|
|
11
|
+
export interface TopazBinding {
|
|
12
|
+
name: string;
|
|
13
|
+
vendorModel: string;
|
|
14
|
+
surface: TopazSurface;
|
|
15
|
+
kind?: TopazFilterKind;
|
|
16
|
+
/** Image intent path under /image/v1. */
|
|
17
|
+
imagePath?: string;
|
|
18
|
+
description: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const TOPAZ_MODELS: Record<string, TopazBinding>;
|
|
21
|
+
export declare const TOPAZ_CATALOG: AIModelConfig[];
|
|
22
|
+
export declare const TOPAZ_VIDEO_MODELS: Record<string, TopazBinding>;
|
|
23
|
+
export declare const TOPAZ_IMAGE_MODELS: Record<string, TopazBinding>;
|
|
24
|
+
//# sourceMappingURL=topaz.models.d.ts.map
|