@plasius/ai 1.1.4 → 1.1.6

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +22 -2
  2. package/README.md +101 -2
  3. package/dist/components/pixelverse/balance.d.ts +6 -2
  4. package/dist/components/pixelverse/balance.d.ts.map +1 -1
  5. package/dist/components/pixelverse/balance.js +13 -23
  6. package/dist/components/pixelverse/index.d.ts +1 -1
  7. package/dist/components/pixelverse/index.d.ts.map +1 -1
  8. package/dist/components/pixelverse/index.js +1 -1
  9. package/dist/components/pixelverse/video-generation-editor.d.ts +10 -0
  10. package/dist/components/pixelverse/video-generation-editor.d.ts.map +1 -0
  11. package/dist/components/pixelverse/video-generation-editor.js +79 -0
  12. package/dist/platform/adapter-platform.d.ts +60 -0
  13. package/dist/platform/adapter-platform.d.ts.map +1 -0
  14. package/dist/platform/adapter-platform.js +222 -0
  15. package/dist/platform/gemini-adapter.d.ts +15 -0
  16. package/dist/platform/gemini-adapter.d.ts.map +1 -0
  17. package/dist/platform/gemini-adapter.js +293 -0
  18. package/dist/platform/http-resilience.d.ts +19 -0
  19. package/dist/platform/http-resilience.d.ts.map +1 -0
  20. package/dist/platform/http-resilience.js +126 -0
  21. package/dist/platform/index.d.ts +22 -1
  22. package/dist/platform/index.d.ts.map +1 -1
  23. package/dist/platform/index.js +24 -0
  24. package/dist/platform/openai-adapter.d.ts +24 -0
  25. package/dist/platform/openai-adapter.d.ts.map +1 -0
  26. package/dist/platform/openai-adapter.js +398 -0
  27. package/dist/platform/video-provider-adapter.d.ts +54 -0
  28. package/dist/platform/video-provider-adapter.d.ts.map +1 -0
  29. package/dist/platform/video-provider-adapter.js +165 -0
  30. package/dist/platform/video-provider-platform.d.ts +13 -0
  31. package/dist/platform/video-provider-platform.d.ts.map +1 -0
  32. package/dist/platform/video-provider-platform.js +102 -0
  33. package/dist-cjs/components/pixelverse/balance.d.ts +6 -2
  34. package/dist-cjs/components/pixelverse/balance.d.ts.map +1 -1
  35. package/dist-cjs/components/pixelverse/balance.js +13 -23
  36. package/dist-cjs/components/pixelverse/index.d.ts +1 -1
  37. package/dist-cjs/components/pixelverse/index.d.ts.map +1 -1
  38. package/dist-cjs/components/pixelverse/index.js +1 -1
  39. package/dist-cjs/components/pixelverse/video-generation-editor.d.ts +10 -0
  40. package/dist-cjs/components/pixelverse/video-generation-editor.d.ts.map +1 -0
  41. package/dist-cjs/components/pixelverse/video-generation-editor.js +85 -0
  42. package/dist-cjs/platform/adapter-platform.d.ts +60 -0
  43. package/dist-cjs/platform/adapter-platform.d.ts.map +1 -0
  44. package/dist-cjs/platform/adapter-platform.js +225 -0
  45. package/dist-cjs/platform/gemini-adapter.d.ts +15 -0
  46. package/dist-cjs/platform/gemini-adapter.d.ts.map +1 -0
  47. package/dist-cjs/platform/gemini-adapter.js +296 -0
  48. package/dist-cjs/platform/http-resilience.d.ts +19 -0
  49. package/dist-cjs/platform/http-resilience.d.ts.map +1 -0
  50. package/dist-cjs/platform/http-resilience.js +129 -0
  51. package/dist-cjs/platform/index.d.ts +22 -1
  52. package/dist-cjs/platform/index.d.ts.map +1 -1
  53. package/dist-cjs/platform/index.js +30 -1
  54. package/dist-cjs/platform/openai-adapter.d.ts +24 -0
  55. package/dist-cjs/platform/openai-adapter.d.ts.map +1 -0
  56. package/dist-cjs/platform/openai-adapter.js +401 -0
  57. package/dist-cjs/platform/video-provider-adapter.d.ts +54 -0
  58. package/dist-cjs/platform/video-provider-adapter.d.ts.map +1 -0
  59. package/dist-cjs/platform/video-provider-adapter.js +168 -0
  60. package/dist-cjs/platform/video-provider-platform.d.ts +13 -0
  61. package/dist-cjs/platform/video-provider-platform.d.ts.map +1 -0
  62. package/dist-cjs/platform/video-provider-platform.js +105 -0
  63. package/docs/api-reference.md +59 -0
  64. package/docs/architecture.md +5 -1
  65. package/docs/providers.md +24 -6
  66. package/package.json +6 -6
  67. package/src/components/pixelverse/balance.tsx +22 -35
  68. package/src/components/pixelverse/index.ts +1 -1
  69. package/src/components/pixelverse/video-generation-editor.tsx +164 -0
  70. package/src/platform/adapter-platform.ts +440 -0
  71. package/src/platform/gemini-adapter.ts +391 -0
  72. package/src/platform/http-resilience.ts +198 -0
  73. package/src/platform/index.ts +68 -0
  74. package/src/platform/openai-adapter.ts +552 -0
  75. package/src/platform/video-provider-adapter.ts +303 -0
  76. package/src/platform/video-provider-platform.ts +208 -0
  77. package/dist/components/pixelverse/pixelverseeditor.d.ts +0 -16
  78. package/dist/components/pixelverse/pixelverseeditor.d.ts.map +0 -1
  79. package/dist/components/pixelverse/pixelverseeditor.js +0 -21
  80. package/dist/platform/openai.d.ts +0 -8
  81. package/dist/platform/openai.d.ts.map +0 -1
  82. package/dist/platform/openai.js +0 -61
  83. package/dist/platform/pixelverse.d.ts +0 -6
  84. package/dist/platform/pixelverse.d.ts.map +0 -1
  85. package/dist/platform/pixelverse.js +0 -196
  86. package/dist-cjs/components/pixelverse/pixelverseeditor.d.ts +0 -16
  87. package/dist-cjs/components/pixelverse/pixelverseeditor.d.ts.map +0 -1
  88. package/dist-cjs/components/pixelverse/pixelverseeditor.js +0 -27
  89. package/dist-cjs/platform/openai.d.ts +0 -8
  90. package/dist-cjs/platform/openai.d.ts.map +0 -1
  91. package/dist-cjs/platform/openai.js +0 -67
  92. package/dist-cjs/platform/pixelverse.d.ts +0 -6
  93. package/dist-cjs/platform/pixelverse.d.ts.map +0 -1
  94. package/dist-cjs/platform/pixelverse.js +0 -199
  95. package/src/components/pixelverse/pixelverseeditor.mocule.css +0 -0
  96. package/src/components/pixelverse/pixelverseeditor.tsx +0 -74
  97. package/src/platform/openai.ts +0 -123
  98. package/src/platform/pixelverse.ts +0 -309
@@ -1,123 +0,0 @@
1
- import OpenAI from "openai";
2
- import type {
3
- AIPlatform,
4
- BalanceCompletion,
5
- ChatCompletion,
6
- Completion,
7
- ImageCompletion,
8
- SpeechCompletion,
9
- TextCompletion,
10
- VideoCompletion,
11
- } from "./index.js";
12
- import { useState } from "react";
13
-
14
- export interface OpenAIPlatformProps {
15
- openaiAPIKey: string;
16
- openaiProjectKey: string;
17
- openaiOrgID: string;
18
- }
19
-
20
- export async function OpenAIPlatform(
21
- userId: string,
22
- props: OpenAIPlatformProps
23
- ): Promise<AIPlatform> {
24
- const openai = new OpenAI({
25
- apiKey: props.openaiAPIKey,
26
- project: props.openaiProjectKey,
27
- organization: props.openaiOrgID,
28
- dangerouslyAllowBrowser: false,
29
- });
30
-
31
- void openai;
32
-
33
- function baseCompletionData(
34
- type: string,
35
- model: string,
36
- requestor: string,
37
- duration: number
38
- ): Completion {
39
- return {
40
- partitionKey: requestor,
41
- id: crypto.randomUUID(),
42
- type,
43
- model,
44
- createdAt: new Date().toISOString(),
45
- durationMs: duration,
46
- usage: {},
47
- };
48
- }
49
-
50
- const chatWithAI = (
51
- userId: string,
52
- input: string,
53
- context: string,
54
- model: string
55
- ): Promise<ChatCompletion> => {
56
- void [input, context, model];
57
- const base = baseCompletionData("chat", "model", userId, 0);
58
- return Promise.resolve({ ...base, message: "Something", outputUser: "" });
59
- };
60
-
61
- const synthesizeSpeech = (
62
- userId: string,
63
- input: string,
64
- voice: string,
65
- context: string,
66
- model: string
67
- ): Promise<SpeechCompletion> => {
68
- void [input, voice, context, model];
69
- const base = baseCompletionData("chat", "model", userId, 0);
70
- return Promise.resolve({ ...base, url: new URL("Something") });
71
- };
72
-
73
- const transcribeSpeech = (
74
- userId: string,
75
- input: Buffer,
76
- context: string,
77
- model: string
78
- ): Promise<TextCompletion> => {
79
- void [input, context, model];
80
- const base = baseCompletionData("chat", "model", userId, 0);
81
- return Promise.resolve({ ...base, message: "Something" });
82
- };
83
-
84
- const generateImage = (
85
- userId: string,
86
- input: string,
87
- context: string,
88
- model: string
89
- ): Promise<ImageCompletion> => {
90
- void [input, context, model];
91
- const base = baseCompletionData("chat", "model", userId, 0);
92
- return Promise.resolve({ ...base, url: new URL("Something") });
93
- };
94
-
95
- const produceVideo = (
96
- userId: string,
97
- imput: string,
98
- image: URL,
99
- context: string,
100
- model: string
101
- ): Promise<VideoCompletion> => {
102
- void [imput, image, context, model];
103
- const base = baseCompletionData("chat", "model", userId, 0);
104
- return Promise.resolve({ ...base, url: new URL("Something") });
105
- };
106
-
107
- const checkBalance = (userId: string): Promise<BalanceCompletion> => {
108
- const base = baseCompletionData("balanceCompletion", "", userId, 0);
109
- return Promise.resolve({ ...base, balance: 0.0 });
110
- };
111
-
112
- const [currentBalance] = useState<number>((await checkBalance(userId)).balance! as number);
113
-
114
- return {
115
- chatWithAI,
116
- synthesizeSpeech,
117
- transcribeSpeech,
118
- generateImage,
119
- produceVideo,
120
- checkBalance,
121
- currentBalance,
122
- };
123
- }
@@ -1,309 +0,0 @@
1
- import { v4 as uuidv4 } from "uuid";
2
- import { performance } from "perf_hooks";
3
-
4
- import type {
5
- AIPlatform,
6
- BalanceCompletion,
7
- ChatCompletion,
8
- Completion,
9
- ImageCompletion,
10
- SpeechCompletion,
11
- TextCompletion,
12
- VideoCompletion,
13
- } from "./index.js";
14
- import { useState } from "react";
15
-
16
- interface UploadImageResponse {
17
- Resp?: { id?: number };
18
- }
19
-
20
- interface GenerateVideoResponse {
21
- Resp?: { id?: number };
22
- }
23
-
24
- interface VideoStatusResponse {
25
- Resp?: { status?: number; url?: string };
26
- }
27
-
28
- interface BalanceResponse {
29
- Resp?: { credit_monthly?: number; credit_package?: number };
30
- }
31
-
32
- export interface PixelVersePlatformProps {
33
- pixelVerseAPIKey: string;
34
- }
35
-
36
- export async function PixelVersePlatform(
37
- userId: string,
38
- props: PixelVersePlatformProps
39
- ): Promise<AIPlatform> {
40
- async function uploadImage(image: File | URL, apiKey: string): Promise<UploadImageResponse> {
41
- const headers = new Headers();
42
- headers.append("API-KEY", apiKey);
43
- headers.append("Ai-trace-id", uuidv4());
44
- headers.append("Access-Control-Allow-Origin", "*");
45
-
46
- const formData = new FormData();
47
- if (image instanceof File) {
48
- formData.append("image", image, "");
49
- } else {
50
- const blob = await fetch(image.toString()).then((r) => r.blob());
51
- formData.append("image", blob, "image-from-url");
52
- }
53
-
54
- // pixelapi is proxied through the vite.config.ts file
55
- // to avoid CORS issues and to allow for local development
56
- const response = await fetch("/pixelapi/openapi/v2/image/upload", {
57
- method: "POST",
58
- headers,
59
- body: formData,
60
- redirect: "follow",
61
- });
62
- const data = (await response.json()) as UploadImageResponse;
63
- return data;
64
- }
65
-
66
- async function generateVideo(
67
- imgId: number,
68
- prompt: string,
69
- apiKey: string,
70
- seed?: number,
71
- template_id?: string,
72
- negative_prompt?: string
73
- ): Promise<GenerateVideoResponse> {
74
- const headers = new Headers();
75
- headers.append("API-KEY", apiKey);
76
- headers.append("Ai-trace-id", uuidv4());
77
- headers.append("Content-Type", "application/json");
78
- headers.append("Access-Control-Allow-Origin", "*");
79
- headers.append("Accept", "application/json");
80
- const values: {
81
- duration: number;
82
- img_id: number;
83
- model: string;
84
- motion_mode: string;
85
- prompt: string;
86
- quality: string;
87
- water_mark: boolean;
88
- seed?: number;
89
- template_id?: string;
90
- negative_prompt?: string;
91
- } = {
92
- duration: 5,
93
- img_id: imgId,
94
- model: "v3.5",
95
- motion_mode: "normal",
96
- prompt: prompt,
97
- quality: "720p",
98
- water_mark: false,
99
- };
100
-
101
- if (seed) {
102
- values.seed = seed;
103
- }
104
- if (template_id) {
105
- values.template_id = template_id;
106
- }
107
- if (negative_prompt) {
108
- values.negative_prompt = negative_prompt;
109
- }
110
-
111
- const body = JSON.stringify(values);
112
-
113
- // pixelapi is proxied through the vite.config.ts file
114
- // to avoid CORS issues and to allow for local development
115
- const response = await fetch("/pixelapi/openapi/v2/video/img/generate", {
116
- method: "POST",
117
- headers: headers,
118
- referrerPolicy: "no-referrer",
119
- body,
120
- });
121
- const data = (await response.json()) as GenerateVideoResponse;
122
- return data;
123
- }
124
-
125
- async function checkVideoStatus(id: number, apiKey: string): Promise<VideoStatusResponse> {
126
- const headers = new Headers();
127
- headers.append("API-KEY", apiKey);
128
- headers.append("Ai-trace-id", uuidv4());
129
- headers.append("Access-Control-Allow-Origin", "*");
130
- headers.append("Accept", "application/json");
131
-
132
- // pixelapi is proxied through the vite.config.ts file
133
- // to avoid CORS issues and to allow for local development
134
- const response = await fetch(`/pixelapi/openapi/v2/video/result/${id}`, {
135
- method: "GET",
136
- headers,
137
- referrerPolicy: "no-referrer",
138
- });
139
- const data = (await response.json()) as VideoStatusResponse;
140
- return data;
141
- }
142
-
143
- function baseCompletionData(
144
- type: string,
145
- model: string,
146
- requestor: string,
147
- duration: number
148
- ): Completion {
149
- return {
150
- partitionKey: requestor,
151
- id: crypto.randomUUID(),
152
- type,
153
- model,
154
- createdAt: new Date().toISOString(),
155
- durationMs: duration,
156
- usage: {},
157
- };
158
- }
159
-
160
- const chatWithAI = (
161
- _userId: string,
162
- _input: string,
163
- _context: string,
164
- _model: string
165
- ): Promise<ChatCompletion> => {
166
- void [_userId, _input, _context, _model];
167
- return Promise.reject(new Error("Not implemented"));
168
- };
169
-
170
- const synthesizeSpeech = (
171
- _userId: string,
172
- _input: string,
173
- _voice: string,
174
- _context: string,
175
- _model: string
176
- ): Promise<SpeechCompletion> => {
177
- void [_userId, _input, _voice, _context, _model];
178
- return Promise.reject(new Error("Not implemented"));
179
- };
180
-
181
- const transcribeSpeech = (
182
- _userId: string,
183
- _input: Buffer,
184
- _context: string,
185
- _model: string
186
- ): Promise<TextCompletion> => {
187
- void [_userId, _input, _context, _model];
188
- return Promise.reject(new Error("Not implemented"));
189
- };
190
-
191
- const generateImage = (
192
- _userId: string,
193
- _input: string,
194
- _context: string,
195
- _model: string
196
- ): Promise<ImageCompletion> => {
197
- void [_userId, _input, _context, _model];
198
- return Promise.reject(new Error("Not implemented"));
199
- };
200
-
201
- const produceVideo = (
202
- userId: string,
203
- input: string,
204
- image: File | URL,
205
- context: string,
206
- model: string
207
- ): Promise<VideoCompletion> => {
208
- const start = performance.now();
209
- return uploadImage(image, props.pixelVerseAPIKey)
210
- .then((uploadResult: UploadImageResponse) => {
211
- const imageId = uploadResult?.Resp?.id;
212
- if (!imageId) throw new Error("Invalid image upload response.");
213
- return generateVideo(imageId, input, props.pixelVerseAPIKey);
214
- })
215
- .then((generated: GenerateVideoResponse) => {
216
- const videoId = generated?.Resp?.id;
217
- if (!videoId)
218
- throw new Error("Video generation did not return a valid ID.");
219
- return waitForVideoCompletion(videoId, props.pixelVerseAPIKey);
220
- })
221
- .then((videoUrl) => {
222
- const duration = performance.now() - start;
223
- const base = baseCompletionData("video", model, userId, duration);
224
- return {
225
- ...base,
226
- url: new URL(videoUrl),
227
- };
228
- })
229
- .catch((err) => {
230
- // Optional: log or re-throw error for upstream handling
231
- throw new Error(`produceVideo failed: ${(err as Error).message}`);
232
- });
233
- };
234
-
235
- async function waitForVideoCompletion(
236
- videoId: number,
237
- apiKey: string,
238
- maxRetries = 20,
239
- delayMs = 3000
240
- ): Promise<string> {
241
- for (let attempt = 0; attempt < maxRetries; attempt++) {
242
- await new Promise((res) => setTimeout(res, delayMs));
243
- try {
244
- const videoCheck: VideoStatusResponse = await checkVideoStatus(videoId, apiKey);
245
- if (videoCheck?.Resp?.status === 1) {
246
- const url = videoCheck?.Resp?.url;
247
- if (!url)
248
- throw new Error("Video marked complete but no URL returned.");
249
- return url;
250
- }
251
- } catch (err) {
252
- console.warn(
253
- `Attempt ${attempt + 1} failed: ${(err as Error).message}`
254
- );
255
- }
256
- }
257
- throw new Error("Timed out waiting for video to complete.");
258
- }
259
-
260
- const checkBalance = (userId: string): Promise<BalanceCompletion> => {
261
- const start = performance.now();
262
- const headers = new Headers();
263
- headers.append("API-KEY", props.pixelVerseAPIKey);
264
- headers.append("AI-trace-ID", uuidv4());
265
- headers.append("Access-Control-Allow-Origin", "*");
266
- headers.append("Accept", "application/json");
267
- headers.append("Content-Type", "application/json");
268
-
269
- return fetch("/pixelapi/openapi/v2/account/balance", {
270
- method: "GET",
271
- headers,
272
- referrerPolicy: "no-referrer",
273
- })
274
- .then(async (res): Promise<BalanceResponse> => (await res.json()) as BalanceResponse)
275
- .then((data) => {
276
- if (!data?.Resp) {
277
- throw new Error("Invalid balance response");
278
- }
279
- const duration = performance.now() - start;
280
- const base = baseCompletionData(
281
- "balanceCompletion",
282
- "",
283
- userId,
284
- duration
285
- );
286
- const monthly = data.Resp.credit_monthly ?? 0;
287
- const pkg = data.Resp.credit_package ?? 0;
288
- return {
289
- ...base,
290
- balance: monthly + pkg,
291
- };
292
- })
293
- .catch((err) => {
294
- throw new Error(`checkBalance failed: ${(err as Error).message}`);
295
- });
296
- };
297
-
298
- const [currentBalance] = useState<number>((await checkBalance(userId)).balance as number ?? 0);
299
-
300
- return {
301
- chatWithAI,
302
- synthesizeSpeech,
303
- transcribeSpeech,
304
- generateImage,
305
- produceVideo,
306
- checkBalance,
307
- currentBalance,
308
- };
309
- }