@nodetool-ai/higgsfield-nodes 0.8.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.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @nodetool-ai/higgsfield-nodes
2
+
3
+ Curated Higgsfield image and video nodes for NodeTool. Models are declared in
4
+ `higgsfield-manifest.json` only after their API-reference schema and output
5
+ mapping have been verified.
@@ -0,0 +1 @@
1
+ 2026-09-28T09:19:07.335Z
@@ -0,0 +1,5 @@
1
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
2
+ import { type HiggsfieldCredentials } from "@nodetool-ai/runtime";
3
+ export declare function getCredentials(secrets: Record<string, string> | undefined): HiggsfieldCredentials;
4
+ export declare function resolveHiggsfieldMedia(ref: unknown, context: ProcessingContext | undefined, credentials: HiggsfieldCredentials, mimeType: string, signal?: AbortSignal): Promise<string>;
5
+ //# sourceMappingURL=higgsfield-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"higgsfield-base.d.ts","sourceRoot":"","sources":["../src/higgsfield-base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAoD,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEpH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,qBAAqB,CAKjG;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,WAAW,EAAE,qBAAqB,EAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -0,0 +1,23 @@
1
+ import { loadMediaRefBytes } from "@nodetool-ai/runtime";
2
+ import { higgsfieldCreateUploadUrl, higgsfieldUploadMedia } from "@nodetool-ai/runtime";
3
+ export function getCredentials(secrets) {
4
+ const keyId = secrets?.HIGGSFIELD_API_KEY_ID || process.env.HIGGSFIELD_API_KEY_ID || "";
5
+ const secret = secrets?.HIGGSFIELD_API_KEY_SECRET || process.env.HIGGSFIELD_API_KEY_SECRET || "";
6
+ if (!keyId.trim() || !secret.trim())
7
+ throw new Error("HIGGSFIELD_API_KEY_ID and HIGGSFIELD_API_KEY_SECRET are required");
8
+ return { keyId: keyId.trim(), secret: secret.trim() };
9
+ }
10
+ export async function resolveHiggsfieldMedia(ref, context, credentials, mimeType, signal) {
11
+ if (typeof ref !== "object" || ref === null || Array.isArray(ref))
12
+ throw new Error("A media reference is required");
13
+ const record = ref;
14
+ const uri = typeof record.uri === "string" ? record.uri : "";
15
+ if (/^https:\/\//.test(uri))
16
+ return uri;
17
+ const bytes = await loadMediaRefBytes(record, context);
18
+ if (!bytes || bytes.length === 0)
19
+ throw new Error("Could not resolve Higgsfield media input");
20
+ const upload = await higgsfieldCreateUploadUrl(credentials, mimeType, signal);
21
+ return higgsfieldUploadMedia(upload, bytes, mimeType, signal);
22
+ }
23
+ //# sourceMappingURL=higgsfield-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"higgsfield-base.js","sourceRoot":"","sources":["../src/higgsfield-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAA8B,MAAM,sBAAsB,CAAC;AAEpH,MAAM,UAAU,cAAc,CAAC,OAA2C;IACxE,MAAM,KAAK,GAAG,OAAO,EAAE,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IACxF,MAAM,MAAM,GAAG,OAAO,EAAE,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC;IACjG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACzH,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAY,EACZ,OAAsC,EACtC,WAAkC,EAClC,QAAgB,EAChB,MAAoB;IAEpB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACpH,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9E,OAAO,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { NodeClass } from "@nodetool-ai/node-sdk";
2
+ export type HiggsfieldFieldType = "str" | "int" | "float" | "bool" | "enum" | "image" | "video" | "audio" | "list[image]" | "list[video]" | "list[audio]";
3
+ export interface HiggsfieldField {
4
+ name: string;
5
+ type: HiggsfieldFieldType;
6
+ title?: string;
7
+ description?: string;
8
+ default?: unknown;
9
+ values?: Array<string | number>;
10
+ min?: number;
11
+ max?: number;
12
+ maxItems?: number;
13
+ required?: boolean;
14
+ }
15
+ export interface HiggsfieldManifestEntry {
16
+ configVersion: number;
17
+ modelId: string;
18
+ className: string;
19
+ moduleName: string;
20
+ task: string;
21
+ outputType: "image" | "video";
22
+ outputCardinality?: "single" | "many";
23
+ title: string;
24
+ description: string;
25
+ sourceUrl: string;
26
+ schemaFixture: string;
27
+ pollIntervalMs: number;
28
+ timeoutSeconds: number;
29
+ fields: HiggsfieldField[];
30
+ }
31
+ export declare function createHiggsfieldNodeClass(spec: HiggsfieldManifestEntry): NodeClass;
32
+ export declare function loadHiggsfieldNodesFromManifest(manifest: HiggsfieldManifestEntry[]): readonly NodeClass[];
33
+ export declare function loadHiggsfieldManifest(): HiggsfieldManifestEntry[];
34
+ //# sourceMappingURL=higgsfield-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"higgsfield-factory.d.ts","sourceRoot":"","sources":["../src/higgsfield-factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAA0B,MAAM,uBAAuB,CAAC;AAK/E,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AAC1J,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAAE;AAC1O,MAAM,WAAW,uBAAuB;IAAG,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAC;CAAE;AAqBxW,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,SAAS,CAuDlF;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,uBAAuB,EAAE,GAAG,SAAS,SAAS,EAAE,CAAoD;AAC9J,wBAAgB,sBAAsB,IAAI,uBAAuB,EAAE,CAAyJ"}
@@ -0,0 +1,98 @@
1
+ import { loadPackageAssetJson } from "@nodetool-ai/config";
2
+ import { applyContentCardBody, BaseNode, classifyFields, defaultForPropType, propertyOf, registerDeclaredProperty } from "@nodetool-ai/node-sdk";
3
+ import { higgsfieldAwaitResult, higgsfieldDownloadResult, higgsfieldOutputUrls, higgsfieldSubmit } from "@nodetool-ai/runtime";
4
+ import { getCredentials, resolveHiggsfieldMedia } from "./higgsfield-base.js";
5
+ function mime(type) { return type === "video" ? "video/mp4" : type === "audio" ? "audio/wav" : "image/png"; }
6
+ function outputMime(type, input) {
7
+ return type === "video" && input.output_format === "mov" ? "video/quicktime" : mime(type);
8
+ }
9
+ function scalar(value, type) { if (type === "int" && typeof value === "number")
10
+ return Math.trunc(value); return value; }
11
+ function validateNumericRange(value, field) {
12
+ if (typeof value !== "number")
13
+ return;
14
+ if (field.min !== undefined && value < field.min)
15
+ throw new Error(`${field.name} must be at least ${field.min}`);
16
+ if (field.max !== undefined && value > field.max)
17
+ throw new Error(`${field.name} must be at most ${field.max}`);
18
+ }
19
+ function isEmptyMediaRef(value) {
20
+ if (typeof value !== "object" || value === null || Array.isArray(value))
21
+ return false;
22
+ const record = value;
23
+ return record.uri === "" && record.data === null && record.asset_id === null;
24
+ }
25
+ export function createHiggsfieldNodeClass(spec) {
26
+ const Node = class extends BaseNode {
27
+ async process(context) {
28
+ const credentials = getCredentials(this._secrets);
29
+ const input = {};
30
+ for (const field of spec.fields) {
31
+ const value = propertyOf(this, field.name);
32
+ if (value === undefined || value === null || value === "" || isEmptyMediaRef(value) || (Array.isArray(value) && value.length === 0 && !field.required)) {
33
+ if (field.required)
34
+ throw new Error(`${spec.title}: ${field.name} is required`);
35
+ continue;
36
+ }
37
+ if (field.type === "image" || field.type === "video" || field.type === "audio") {
38
+ input[field.name] = await resolveHiggsfieldMedia(value, context, credentials, mime(field.type));
39
+ }
40
+ else if (field.type === "list[image]" || field.type === "list[video]" || field.type === "list[audio]") {
41
+ if (!Array.isArray(value))
42
+ throw new Error(`${spec.title}: ${field.name} must be a list`);
43
+ if (field.maxItems !== undefined && value.length > field.maxItems)
44
+ throw new Error(`${spec.title}: ${field.name} accepts at most ${field.maxItems} items`);
45
+ input[field.name] = await Promise.all(value.map((item) => resolveHiggsfieldMedia(item, context, credentials, mime(field.type === "list[video]" ? "video" : field.type === "list[audio]" ? "audio" : "image"))));
46
+ }
47
+ else if (field.type === "enum" && field.values && !field.values.some((allowed) => allowed === value)) {
48
+ throw new Error(`${spec.title}: ${field.name} has an unsupported value`);
49
+ }
50
+ else {
51
+ const normalized = scalar(value, field.type);
52
+ validateNumericRange(normalized, field);
53
+ input[field.name] = normalized;
54
+ }
55
+ }
56
+ const submission = await higgsfieldSubmit(credentials, spec.modelId, input);
57
+ const result = await higgsfieldAwaitResult(credentials, submission.status_url, { timeoutMs: spec.timeoutSeconds * 1000 });
58
+ const mediaType = spec.outputType;
59
+ const mediaMime = outputMime(mediaType, input);
60
+ const urls = higgsfieldOutputUrls(result);
61
+ if (urls.length === 0)
62
+ throw new Error(`${spec.title}: completed without a media output`);
63
+ const outputs = await Promise.all(urls.map(async (url, index) => {
64
+ const bytes = await higgsfieldDownloadResult(url);
65
+ if (context?.storage?.store) {
66
+ const uri = await context.storage.store(`higgsfield-${mediaType}-${submission.request_id}-${index}`, bytes, mediaMime);
67
+ return { type: mediaType, uri };
68
+ }
69
+ return { type: mediaType, uri: "", data: Buffer.from(bytes).toString("base64") };
70
+ }));
71
+ return { output: spec.outputCardinality === "many" ? outputs : outputs[0] };
72
+ }
73
+ };
74
+ Object.defineProperties(Node, {
75
+ name: { value: spec.className }, nodeType: { value: `higgsfield.${spec.moduleName}.${spec.className}` }, title: { value: spec.title }, description: { value: spec.description }, requiredSettings: { value: ["HIGGSFIELD_API_KEY_ID", "HIGGSFIELD_API_KEY_SECRET"] }, autoSaveAsset: { value: true }, metadataOutputTypes: { value: { output: spec.outputCardinality === "many" ? `list[${spec.outputType}]` : spec.outputType } }
76
+ });
77
+ applyContentCardBody(Node);
78
+ const classification = classifyFields(spec.fields.map((field) => ({ name: field.name, propType: field.type })));
79
+ Object.defineProperties(Node, { inlineFields: { value: classification.inlineFields }, inputFields: { value: classification.inputFields } });
80
+ for (const field of spec.fields) {
81
+ const options = { type: field.type, default: Object.prototype.hasOwnProperty.call(field, "default") ? field.default : defaultForPropType(field.type) };
82
+ if (field.title)
83
+ options.title = field.title;
84
+ if (field.description)
85
+ options.description = field.description;
86
+ if (field.values)
87
+ options.values = field.values;
88
+ if (field.min !== undefined)
89
+ options.min = field.min;
90
+ if (field.max !== undefined)
91
+ options.max = field.max;
92
+ registerDeclaredProperty(Node, field.name, options);
93
+ }
94
+ return Node;
95
+ }
96
+ export function loadHiggsfieldNodesFromManifest(manifest) { return manifest.map(createHiggsfieldNodeClass); }
97
+ export function loadHiggsfieldManifest() { return loadPackageAssetJson({ pkg: "@nodetool-ai/higgsfield-nodes", path: "higgsfield-manifest.json" }, import.meta.url); }
98
+ //# sourceMappingURL=higgsfield-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"higgsfield-factory.js","sourceRoot":"","sources":["../src/higgsfield-factory.ts"],"names":[],"mappings":"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"}