@hypit/hypit 0.2.8 → 0.2.10

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 CHANGED
@@ -209,6 +209,12 @@ commands and the repository layout.
209
209
  </td>
210
210
  <td><a href="https://api.pollo.ai/?utm_source=hypit">Pollo API</a> gives developers access to 300+ AI image and video models through a single API, with competitive rates. One API key connects you to multiple model providers and scales from 10 to 10,000+ requests.</td>
211
211
  </tr>
212
+ <tr>
213
+ <td width="220" align="center">
214
+ <a href="https://beatapi.io"><img alt="BeatAPI" src="./docs/public/beatapi.png" width="165"></a>
215
+ </td>
216
+ <td><a href="https://beatapi.io">BeatAPI</a> is the professional capability layer for any agent. We provide AI models, real-world data, task-ready capabilities, and professional workspaces that help agents complete real-world tasks.</td>
217
+ </tr>
212
218
  </table>
213
219
 
214
220
  ## ⭐ Star History
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypit/hypit",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "homepage": "https://hypit.ai",
5
5
  "repository": {
6
6
  "type": "git",
@@ -236,8 +236,9 @@
236
236
  "@hypit/program-space": "workspace:*",
237
237
  "@hypit/project-context-node": "workspace:*",
238
238
  "@hypit/protocol": "workspace:*",
239
- "@hypit/provider-hyperframes-local": "workspace:*",
239
+ "@hypit/provider-beatapi": "workspace:*",
240
240
  "@hypit/provider-hiapi": "workspace:*",
241
+ "@hypit/provider-hyperframes-local": "workspace:*",
241
242
  "@hypit/provider-hypihub": "workspace:*",
242
243
  "@hypit/provider-image-opencv-local": "workspace:*",
243
244
  "@hypit/provider-media-local": "workspace:*",
@@ -802,6 +802,7 @@ export async function executeRenderStillVideo(
802
802
  "select=eq(n\\,0)",
803
803
  "loop=loop=-1:size=1:start=0",
804
804
  `trim=start_frame=0:end_frame=${frames}`,
805
+ `settb=expr=${denominator}/${numerator}`,
805
806
  `setpts=N*${denominator}/(${numerator}*TB)`,
806
807
  ].join(",");
807
808
  let argv: string[];
@@ -1278,7 +1279,6 @@ export async function executeMuxProgramMedia(
1278
1279
  "-y", "-i", visualPath, "-i", audioPath,
1279
1280
  "-map", `0:${visual.index}`, "-map", "1:0",
1280
1281
  "-c:v", "copy", "-c:a", "aac", "-ar", "48000", "-ac", "2",
1281
- "-frames:v", String(need.visual.frameCount),
1282
1282
  "-movflags", "+faststart", output,
1283
1283
  ],
1284
1284
  timeoutMs: env.processTimeoutMs,
@@ -1,16 +1,18 @@
1
1
  # `@hypit/pixverse`
2
2
 
3
- Exact author/compute contracts and a package-owned author Surface for PixVerse V6.
3
+ Exact author/compute contracts and package-owned author Surfaces for PixVerse. The package carries
4
+ two exact models, `pixverse-v6` and `pixverse-c1`, and selects no Provider, API key or network
5
+ execution. The selected Provider implements the exact capability.
4
6
 
5
- The Surface projects the primary result to an ordinary video Artifact. The package contains no
6
- Provider selection, API key or network execution. The selected Provider implements its exact
7
- capability.
8
-
9
- Connect prompt and frames as ordinary graph edges:
7
+ Both models render 1 to 15 seconds at `360p`, `540p`, `720p` or `1080p` from a prompt of up to
8
+ 5,000 characters. `<pix:Video>` generates from the prompt, from a first frame, or from a first and
9
+ last frame; `<pix:ReferenceVideo>` generates from the image and video subjects its `Reference`
10
+ children carry.
10
11
 
11
12
  ```xml
12
13
  <pix:Video
13
14
  id="opening"
15
+ model="v6"
14
16
  prompt={line}
15
17
  duration="5"
16
18
  quality="720p"
@@ -18,17 +20,24 @@ Connect prompt and frames as ordinary graph edges:
18
20
  generate-audio="true"
19
21
  />
20
22
 
21
- <pix:Video id="bridge" prompt={motion} duration="5" quality="720p"
23
+ <pix:Video id="bridge" model="c1" prompt={motion} duration="5" quality="720p"
22
24
  first-frame={hero.image} last-frame={product.image}/>
25
+
26
+ <pix:ReferenceVideo id="fusion" model="v6" prompt={outfit} duration="5" quality="720p" aspect-ratio="16:9">
27
+ <pix:Reference image={character.image}/>
28
+ <pix:Reference image={clothes.image}/>
29
+ </pix:ReferenceVideo>
23
30
  ```
24
31
 
25
- The Surface only lowers this syntax into the package's exact model request. It does not select a
26
- Provider.
32
+ The prompt addresses the references in the order they appear, as `@ref_1`, `@ref_2` and so on. V6
33
+ takes up to ten image references and C1 up to seven. V6 also takes up to two video references
34
+ totalling 15 seconds; those carry the length of the run, so that element states no `duration`, and
35
+ `aspect-ratio="auto"` takes their shape.
27
36
 
28
- The model renders 1 to 15 seconds at `360p`, `540p`, `720p` or `1080p`. A prompt-only run states its
29
- `aspect-ratio`; a run that starts from a `first-frame` takes that frame's shape instead. A
30
- `last-frame` bridges from the first frame into one continuous shot, so it is not combined with
31
- `multi-clip`, which renders the prompt as several cuts.
37
+ A prompt-only run states its `aspect-ratio`; a run that starts from a `first-frame` takes that
38
+ frame's shape instead. A `last-frame` bridges from the first frame into one continuous shot, as do
39
+ subject references, so neither is combined with V6's `multi-clip`, which renders the prompt as
40
+ several cuts. `seed` and `multi-clip` are V6's own switches.
32
41
 
33
42
  `generate-audio` renders an audio track alongside the picture, including speech the prompt asks a
34
43
  character to say. The model exposes no separate voice, language or dialogue field, so a spoken line
@@ -2,10 +2,12 @@ import { createMarkupSurfaceHostFacet } from "@hypit/markup";
2
2
  import {
3
3
  pixverseComponent, pixverseDefinition, pixverseManifest, pixverseModuleRef, pixverseMarkupSurfaces,
4
4
  } from "./index.js";
5
- import { decodePixverseVideoSurface } from "./surface.js";
5
+ import { decodePixverseReferenceVideoSurface, decodePixverseVideoSurface } from "./surface.js";
6
6
  export const hypitPackage = { format: "hypit.node-package@1" as const, modules: [{ manifest: pixverseManifest }], components: [pixverseComponent], hostFacets: [
7
7
  pixverseDefinition.hostFacet,
8
8
  createMarkupSurfaceHostFacet({ module: pixverseModuleRef,
9
9
  declaration: pixverseMarkupSurfaces.find((item) => item.name === "video")!, handler: decodePixverseVideoSurface }),
10
+ createMarkupSurfaceHostFacet({ module: pixverseModuleRef,
11
+ declaration: pixverseMarkupSurfaces.find((item) => item.name === "reference-video")!, handler: decodePixverseReferenceVideoSurface }),
10
12
  ] };
11
13
  export default hypitPackage;
@@ -1,117 +1,231 @@
1
1
  import { artifactTypes } from "@hypit/artifact";
2
2
  import { sealGenerationPortRequest, sealGenerationPortTable } from "@hypit/generation";
3
- import type { GenerationPortTable, GenerationPortValue, GenerationRequest } from "@hypit/generation";
4
- import type { SurfaceAttributeVocabulary } from "@hypit/markup";
3
+ import type {
4
+ GenerationPort,
5
+ GenerationPortRequirement,
6
+ GenerationPortTable,
7
+ GenerationPortValue,
8
+ GenerationRequest,
9
+ } from "@hypit/generation";
10
+ import type { SurfaceAttributeVocabulary, SurfacePortVocabulary } from "@hypit/markup";
5
11
  import { defineExactModelModule } from "@hypit/model-kit";
6
12
  import { textTypes } from "@hypit/text";
7
13
 
14
+ import { pixverseRequestValidator } from "./validation.js";
15
+
8
16
  export const pixverseModuleRef = { name: "@hypit/pixverse", version: "1" } as const;
9
- export const pixverseModels = ["pixverse-v6"] as const;
17
+ export const pixverseModels = ["pixverse-v6", "pixverse-c1"] as const;
10
18
  export type PixverseModel = typeof pixverseModels[number];
11
19
 
12
20
  const PIXVERSE_QUALITIES = ["360p", "540p", "720p", "1080p"] as const;
13
21
  const PIXVERSE_ASPECT_RATIOS = ["16:9", "4:3", "1:1", "3:4", "9:16", "2:3", "3:2", "21:9"] as const;
22
+ /** V6 reads `auto` as the shape of the reference videos it generates from. */
23
+ const PIXVERSE_V6_ASPECT_RATIOS = [...PIXVERSE_ASPECT_RATIOS, "auto"] as const;
14
24
 
15
- export const pixverseV6Ports: GenerationPortTable = sealGenerationPortTable({
16
- model: "pixverse-v6",
17
- result: "video",
18
- ports: [
19
- { name: "prompt", value: { kind: "text", maxChars: 5_000 }, minItems: 1, maxItems: 1 },
20
- { name: "firstFrame", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: 1 },
21
- { name: "lastFrame", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: 1 },
22
- { name: "duration", value: { kind: "number", integer: true, minimum: 1, maximum: 15 }, minItems: 1, maxItems: 1 },
23
- { name: "quality", value: { kind: "enum", values: [...PIXVERSE_QUALITIES] }, minItems: 1, maxItems: 1 },
24
- { name: "aspectRatio", value: { kind: "enum", values: [...PIXVERSE_ASPECT_RATIOS] }, minItems: 0, maxItems: 1 },
25
- { name: "generateAudio", value: { kind: "boolean" }, minItems: 0, maxItems: 1 },
26
- { name: "multiClip", value: { kind: "boolean" }, minItems: 0, maxItems: 1 },
27
- { name: "seed", value: { kind: "number", integer: true, minimum: 0, maximum: 2_147_483_647 }, minItems: 0, maxItems: 1 },
28
- ],
29
- requires: [
30
- // A last frame states where a run that already has a first frame ends.
31
- { kind: "requiresPresent", port: "lastFrame", needs: ["firstFrame"] },
32
- // A run that starts from a frame inherits that frame's shape, and one that
33
- // bridges two frames renders a single continuous shot.
34
- { kind: "atMostOneOf", ports: ["aspectRatio", "firstFrame"] },
35
- { kind: "atMostOneOf", ports: ["multiClip", "lastFrame"] },
36
- ],
37
- });
25
+ /**
26
+ * Exact PixVerse model inputs. V6 takes up to ten reference images and up to two reference videos,
27
+ * and carries the sampling seed and multi-clip switch its endpoints declare. C1 takes up to seven
28
+ * reference images and generates from a prompt, a frame or a pair of frames.
29
+ */
30
+ function pixversePortTable(model: PixverseModel): GenerationPortTable {
31
+ const v6 = model === "pixverse-v6";
32
+ const referenceVideo: readonly GenerationPort[] = v6
33
+ ? [{ name: "referenceVideo", value: { kind: "media", accepts: ["video"] }, minItems: 0, maxItems: 2 }]
34
+ : [];
35
+ const v6Switches: readonly GenerationPort[] = v6
36
+ ? [
37
+ { name: "multiClip", value: { kind: "boolean" }, minItems: 0, maxItems: 1 },
38
+ { name: "seed", value: { kind: "number", integer: true, minimum: 0, maximum: 2_147_483_647 }, minItems: 0, maxItems: 1 },
39
+ ]
40
+ : [];
41
+ const v6Requires: readonly GenerationPortRequirement[] = v6
42
+ ? [
43
+ // A run that bridges two frames, and one that carries subject references, is a single
44
+ // continuous shot rather than several cuts.
45
+ { kind: "atMostOneOf", ports: ["multiClip", "lastFrame"] },
46
+ { kind: "atMostOneOf", ports: ["multiClip", "referenceImage"] },
47
+ // The reference videos carry the length of the generated run.
48
+ { kind: "atMostOneOf", ports: ["duration", "referenceVideo"] },
49
+ ]
50
+ : [];
51
+ return sealGenerationPortTable({
52
+ model,
53
+ result: "video",
54
+ ports: [
55
+ { name: "prompt", value: { kind: "text", maxChars: 5_000 }, minItems: 1, maxItems: 1 },
56
+ { name: "firstFrame", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: 1 },
57
+ { name: "lastFrame", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: 1 },
58
+ { name: "referenceImage", value: { kind: "media", accepts: ["image"] }, minItems: 0, maxItems: v6 ? 10 : 7 },
59
+ ...referenceVideo,
60
+ // Required except in the reference-video mode, which pixverseRequestValidator states.
61
+ { name: "duration", value: { kind: "number", integer: true, minimum: 1, maximum: 15 }, minItems: 0, maxItems: 1 },
62
+ { name: "quality", value: { kind: "enum", values: [...PIXVERSE_QUALITIES] }, minItems: 1, maxItems: 1 },
63
+ {
64
+ name: "aspectRatio",
65
+ value: { kind: "enum", values: v6 ? [...PIXVERSE_V6_ASPECT_RATIOS] : [...PIXVERSE_ASPECT_RATIOS] },
66
+ minItems: 0,
67
+ maxItems: 1,
68
+ },
69
+ { name: "generateAudio", value: { kind: "boolean" }, minItems: 0, maxItems: 1 },
70
+ ...v6Switches,
71
+ ],
72
+ requires: [
73
+ // A last frame states where a run that already has a first frame ends.
74
+ { kind: "requiresPresent", port: "lastFrame", needs: ["firstFrame"] },
75
+ // A run that starts from a frame inherits that frame's shape.
76
+ { kind: "atMostOneOf", ports: ["aspectRatio", "firstFrame"] },
77
+ // Frames and subject references are separate ways of placing an image in the run.
78
+ { kind: "atMostOneOf", ports: ["referenceImage", "firstFrame"] },
79
+ ...v6Requires,
80
+ ],
81
+ });
82
+ }
38
83
 
39
84
  export const pixversePorts: Readonly<Record<PixverseModel, GenerationPortTable>> = {
40
- "pixverse-v6": pixverseV6Ports,
85
+ "pixverse-v6": pixversePortTable("pixverse-v6"),
86
+ "pixverse-c1": pixversePortTable("pixverse-c1"),
41
87
  };
42
88
 
43
89
  export function sealPixverseRequest(
90
+ model: PixverseModel,
44
91
  ports: Readonly<Record<string, readonly GenerationPortValue[]>>,
45
92
  ): GenerationRequest {
46
- return sealGenerationPortRequest(pixverseV6Ports, ports);
93
+ return sealGenerationPortRequest(pixversePorts[model], ports);
47
94
  }
48
95
 
49
96
  const pixverseBaseDefinition = defineExactModelModule({
50
97
  module: pixverseModuleRef,
51
- endpoints: [{
52
- key: "video",
53
- requestTypeName: "PixverseV6Request",
54
- producerName: "request-pixverse-v6",
55
- ports: pixverseV6Ports,
56
- }],
98
+ endpoints: ([["v6", "pixverse-v6"], ["c1", "pixverse-c1"]] as const).map(([key, model]) => ({
99
+ key,
100
+ requestTypeName: model === "pixverse-v6" ? "PixverseV6Request" : "PixverseC1Request",
101
+ producerName: `request-${model}`,
102
+ ports: pixversePorts[model],
103
+ validateRequest: pixverseRequestValidator(model),
104
+ })),
57
105
  });
58
106
 
59
107
  export const pixverseEndpoints = pixverseBaseDefinition.endpoints;
108
+ export const pixverseEndpointsByModel = {
109
+ "pixverse-v6": pixverseEndpoints.v6!,
110
+ "pixverse-c1": pixverseEndpoints.c1!,
111
+ } as const;
60
112
  export const pixverseComponent = pixverseBaseDefinition.component;
61
- const endpoint = pixverseEndpoints.video!;
62
113
 
63
- const pixverseAttributes: readonly SurfaceAttributeVocabulary[] = [
114
+ const surfaceOutputs = Object.values(pixverseEndpoints).flatMap((endpoint) => [
115
+ endpoint.draftType,
116
+ ...Object.values(endpoint.mediaBindings).map((binding) => binding.type),
117
+ ]);
118
+
119
+ const pixverseCommonAttributes: readonly SurfaceAttributeVocabulary[] = [
64
120
  { name: "id", kind: "identifier", required: true,
65
121
  summary: "Names this generation so its video Artifact can be referenced elsewhere in the Source." },
122
+ { name: "model", kind: "literal", required: true, values: ["v6", "pixverse-v6", "c1", "pixverse-c1"],
123
+ summary: "Chooses the exact PixVerse model that renders the video." },
66
124
  { name: "prompt", kind: "reference", required: true, accepts: [textTypes.text],
67
125
  summary: "The Text edge describing the shot, including any spoken line the model should voice." },
68
- { name: "first-frame", kind: "reference", required: false, accepts: [artifactTypes.blob],
69
- summary: "Starts the video from one image Artifact." },
70
- { name: "last-frame", kind: "reference", required: false, accepts: [artifactTypes.blob],
71
- summary: "Ends the video on one image Artifact, bridging from the first frame." },
72
- { name: "duration", kind: "literal", required: true,
73
- summary: "How many seconds of video to render, from 1 to 15." },
74
126
  { name: "quality", kind: "literal", required: true, values: [...PIXVERSE_QUALITIES],
75
127
  summary: "The size band the model renders at." },
76
- { name: "aspect-ratio", kind: "literal", required: false, values: [...PIXVERSE_ASPECT_RATIOS],
77
- summary: "The Frame shape of the generated video." },
78
128
  { name: "generate-audio", kind: "literal", required: false, values: ["true", "false"],
79
129
  summary: "Renders an audio track alongside the picture." },
80
- { name: "multi-clip", kind: "literal", required: false, values: ["true", "false"],
81
- summary: "Renders the prompt as several cuts instead of one continuous shot." },
82
130
  { name: "seed", kind: "literal", required: false,
83
- summary: "Seeds the model's sampling so a rerun stays close to this one." },
131
+ summary: "Seeds V6's sampling so a rerun stays close to this one." },
84
132
  ];
85
133
 
86
- export const pixverseMarkupSurfaces = [{
134
+ const pixverseAspectRatio: SurfaceAttributeVocabulary = {
135
+ name: "aspect-ratio", kind: "literal", required: false, values: [...PIXVERSE_V6_ASPECT_RATIOS],
136
+ summary: "The Frame shape of the generated video.",
137
+ };
138
+
139
+ const pixverseVideoPort: readonly SurfacePortVocabulary[] = [{
87
140
  name: "video",
88
- tag: "Video",
89
- mode: "structured" as const,
90
- outputs: [endpoint.draftType, endpoint.mediaBindings.firstFrame!.type, endpoint.mediaBindings.lastFrame!.type],
91
- vocabulary: {
92
- summary: "Generates one video with the exact PixVerse V6 model from a Text prompt, optionally starting from a frame or bridging two.",
93
- attributes: pixverseAttributes,
94
- ports: [{
95
- name: "video",
96
- type: artifactTypes.blob,
97
- summary: "The generated video, addressed as `<id>.video`.",
98
- }],
99
- example: `<pix:Video
141
+ type: artifactTypes.blob,
142
+ summary: "The generated video, addressed as `<id>.video`.",
143
+ }];
144
+
145
+ const pixverseQualityNote = "`quality` is `360p`, `540p`, `720p` or `1080p`, and `duration` is 1 to 15 seconds.";
146
+ const pixversePromptNote = "A spoken line belongs in the prompt; the model exposes no separate voice, language or dialogue field.";
147
+ const pixverseModelNote = "V6 accepts `seed` and up to ten references; C1 accepts up to seven references.";
148
+
149
+ export const pixverseMarkupSurfaces = [
150
+ {
151
+ name: "video",
152
+ tag: "Video",
153
+ mode: "structured" as const,
154
+ outputs: surfaceOutputs,
155
+ vocabulary: {
156
+ summary: "Generates one video with an exact PixVerse model from a Text prompt, optionally starting from a frame or bridging two.",
157
+ attributes: [
158
+ ...pixverseCommonAttributes,
159
+ { name: "duration", kind: "literal" as const, required: true,
160
+ summary: "How many seconds of video to render, from 1 to 15." },
161
+ { name: "first-frame", kind: "reference" as const, required: false, accepts: [artifactTypes.blob],
162
+ summary: "Starts the video from one image Artifact." },
163
+ { name: "last-frame", kind: "reference" as const, required: false, accepts: [artifactTypes.blob],
164
+ summary: "Ends the video on one image Artifact, bridging from the first frame." },
165
+ pixverseAspectRatio,
166
+ { name: "multi-clip", kind: "literal" as const, required: false, values: ["true", "false"],
167
+ summary: "Renders the prompt as several cuts instead of one continuous shot, on V6." },
168
+ ],
169
+ ports: pixverseVideoPort,
170
+ example: `<pix:Video
100
171
  id="opening"
172
+ model="v6"
101
173
  prompt={line}
102
174
  duration="5"
103
175
  quality="720p"
104
176
  aspect-ratio="9:16"
105
177
  generate-audio="true"
106
178
  />`,
107
- notes: [
108
- "A run that starts from a frame takes its shape from that frame, so `aspect-ratio` states the shape only for a prompt-only run.",
109
- "A `last-frame` bridges from the `first-frame` into one continuous shot, so it is not combined with `multi-clip`.",
110
- "A spoken line belongs in the prompt; the model exposes no separate voice, language or dialogue field.",
111
- "The Surface lowers the element into the package's exact model request and selects no Provider.",
112
- ],
179
+ notes: [
180
+ pixverseQualityNote,
181
+ pixverseModelNote,
182
+ "A run that starts from a frame takes its shape from that frame, so `aspect-ratio` states the shape only for a prompt-only run.",
183
+ "A `last-frame` bridges from the `first-frame` into one continuous shot, so it is not combined with `multi-clip`.",
184
+ pixversePromptNote,
185
+ "The element accepts no children and no text content.",
186
+ ],
187
+ },
188
+ },
189
+ {
190
+ name: "reference-video",
191
+ tag: "ReferenceVideo",
192
+ mode: "structured" as const,
193
+ outputs: surfaceOutputs,
194
+ vocabulary: {
195
+ summary: "Generates one video with an exact PixVerse model from a Text prompt and the image or video subjects it carries.",
196
+ attributes: [
197
+ ...pixverseCommonAttributes,
198
+ { name: "duration", kind: "literal" as const, required: false,
199
+ summary: "How many seconds of video to render, from 1 to 15; video references carry their own length." },
200
+ pixverseAspectRatio,
201
+ ],
202
+ children: [{
203
+ tag: "Reference",
204
+ cardinality: "many" as const,
205
+ summary: "Attaches one subject Artifact the model generates from, chosen by an `image` or `video` reference.",
206
+ attributes: [
207
+ { name: "image", kind: "reference" as const, required: false, accepts: [artifactTypes.blob],
208
+ summary: "Selects the image Artifact whose subject the generated video carries." },
209
+ { name: "video", kind: "reference" as const, required: false, accepts: [artifactTypes.blob],
210
+ summary: "Selects the video Artifact whose motion and subject the generated video carries." },
211
+ ],
212
+ }],
213
+ ports: pixverseVideoPort,
214
+ example: `<pix:ReferenceVideo id="fusion" model="v6" prompt={outfit} duration="5" quality="720p" aspect-ratio="16:9">
215
+ <pix:Reference image={character.image}/>
216
+ <pix:Reference image={clothes.image}/>
217
+ </pix:ReferenceVideo>`,
218
+ notes: [
219
+ pixverseQualityNote,
220
+ pixverseModelNote,
221
+ "The prompt addresses the references in order as `@ref_1`, `@ref_2` and so on.",
222
+ "`Reference` carries exactly one of `image` or `video`, and is empty.",
223
+ "V6 accepts up to two video references totalling 15 seconds, which carry the length of the run in place of `duration`; `aspect-ratio=\"auto\"` takes their shape.",
224
+ pixversePromptNote,
225
+ ],
226
+ },
113
227
  },
114
- }] as const;
228
+ ] as const;
115
229
 
116
230
  export const pixverseManifest = {
117
231
  ...pixverseBaseDefinition.manifest,