lionsgate-club-imagegen 0.1.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.
@@ -0,0 +1,143 @@
1
+ export declare const DEFAULT_API_BASE_URL = "https://lionsgate-image-generator-api.vercel.app";
2
+ export type Franchise = "hunger_games" | "john_wick";
3
+ export type FranchisePreset = "general_image" | "character_card";
4
+ export type ImageQuality = "low" | "medium" | "high";
5
+ export type PartialImageTransform = "blur" | "pixelate" | "off";
6
+ export type PfpAvatarCount = 4 | 16;
7
+ export type GenerationStatus = "queued" | "running" | "partial" | "succeeded" | "failed";
8
+ export type ApiErrorPayload = {
9
+ error: {
10
+ message: string;
11
+ type: string;
12
+ param: string | null;
13
+ code: string | null;
14
+ moderation_details?: unknown;
15
+ };
16
+ };
17
+ export type UploadUserImageResponse = {
18
+ upload_id: string;
19
+ user_image_url: string;
20
+ };
21
+ type BaseGenerationStartResponse = {
22
+ generation_id: string;
23
+ status: GenerationStatus;
24
+ done: boolean;
25
+ pfp_image_urls: string[];
26
+ results_url: string;
27
+ events_url: string;
28
+ };
29
+ export type GenerationStartResponse = BaseGenerationStartResponse & {
30
+ partial_image_url?: string | null;
31
+ final_image_url?: string | null;
32
+ };
33
+ type BaseGenerationResult = {
34
+ generation_id: string;
35
+ status: GenerationStatus;
36
+ done: boolean;
37
+ pfp_image_urls: string[];
38
+ error: ApiErrorPayload | null;
39
+ created_at: number;
40
+ updated_at: number;
41
+ };
42
+ export type GenerationResult = BaseGenerationResult & {
43
+ partial_image_url?: string | null;
44
+ final_image_url?: string | null;
45
+ };
46
+ export type ImageGenerationOptions = {
47
+ quality?: ImageQuality;
48
+ size?: string;
49
+ output_format?: "jpeg" | "png" | "webp";
50
+ output_compression?: number;
51
+ partial_images?: number;
52
+ partial_image_transform?: PartialImageTransform;
53
+ blur_partial_images?: boolean;
54
+ };
55
+ export type GenerateFranchiseInput = {
56
+ name: string;
57
+ userImageUrl: string;
58
+ franchise: Franchise;
59
+ preset: FranchisePreset;
60
+ quality?: ImageQuality;
61
+ idempotencyKey?: string;
62
+ partialImageTransform?: PartialImageTransform;
63
+ blurPartialImages?: boolean;
64
+ options?: ImageGenerationOptions;
65
+ };
66
+ export type GenerateFranchiseImageInput = Omit<GenerateFranchiseInput, "userImageUrl"> & {
67
+ file: Blob;
68
+ fileName?: string;
69
+ };
70
+ export type GenerateFranchiseImageResponse = {
71
+ upload: UploadUserImageResponse;
72
+ generation: GenerationStartResponse;
73
+ };
74
+ export type GeneratePfpInput = {
75
+ userImageUrl: string;
76
+ franchise: Franchise;
77
+ quality?: ImageQuality;
78
+ numOfAvatars?: PfpAvatarCount;
79
+ idempotencyKey?: string;
80
+ };
81
+ export type GeneratePfpFromFileInput = Omit<GeneratePfpInput, "userImageUrl"> & {
82
+ file: Blob;
83
+ fileName?: string;
84
+ };
85
+ export type GeneratePfpFromFileResponse = {
86
+ upload: UploadUserImageResponse;
87
+ generation: GenerationStartResponse;
88
+ };
89
+ export type StreamEventName = "status" | "partial" | "final" | "error";
90
+ export type StreamEvent = {
91
+ event: StreamEventName;
92
+ data: GenerationResult | ApiErrorPayload;
93
+ };
94
+ export type StreamHandlers = {
95
+ onStatus?: (result: GenerationResult) => void | Promise<void>;
96
+ onPartial?: (result: GenerationResult) => void | Promise<void>;
97
+ onFinal?: (result: GenerationResult) => void | Promise<void>;
98
+ onError?: (error: ApiErrorPayload) => void | Promise<void>;
99
+ };
100
+ export type PollOptions = {
101
+ intervalMs?: number;
102
+ timeoutMs?: number;
103
+ signal?: AbortSignal;
104
+ };
105
+ export type ClientOptions = {
106
+ apiKey: string;
107
+ baseUrl?: string;
108
+ fetch?: typeof fetch;
109
+ };
110
+ export declare class LionsGateImageApiError extends Error {
111
+ status: number;
112
+ payload: ApiErrorPayload;
113
+ constructor(status: number, payload: ApiErrorPayload);
114
+ }
115
+ export declare class LionsGateImageClient {
116
+ #private;
117
+ constructor(options: ClientOptions);
118
+ uploadUserImage(file: Blob, options?: {
119
+ fileName?: string;
120
+ signal?: AbortSignal;
121
+ }): Promise<UploadUserImageResponse>;
122
+ generateFranchise(input: GenerateFranchiseInput, options?: {
123
+ signal?: AbortSignal;
124
+ }): Promise<GenerationStartResponse>;
125
+ generateFranchiseImage(input: GenerateFranchiseImageInput, options?: {
126
+ signal?: AbortSignal;
127
+ }): Promise<GenerateFranchiseImageResponse>;
128
+ generatePfp(input: GeneratePfpInput, options?: {
129
+ signal?: AbortSignal;
130
+ }): Promise<GenerationStartResponse>;
131
+ generatePfpFromFile(input: GeneratePfpFromFileInput, options?: {
132
+ signal?: AbortSignal;
133
+ }): Promise<GeneratePfpFromFileResponse>;
134
+ getResult(generationId: string, options?: {
135
+ signal?: AbortSignal;
136
+ }): Promise<GenerationResult>;
137
+ pollUntilDone(generationId: string, options?: PollOptions): Promise<GenerationResult>;
138
+ streamGeneration(generationId: string, handlers?: StreamHandlers, options?: {
139
+ signal?: AbortSignal;
140
+ }): Promise<GenerationResult>;
141
+ }
142
+ export {};
143
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,249 @@
1
+ export const DEFAULT_API_BASE_URL = "https://lionsgate-image-generator-api.vercel.app";
2
+ export class LionsGateImageApiError extends Error {
3
+ status;
4
+ payload;
5
+ constructor(status, payload) {
6
+ super(payload.error.message);
7
+ this.name = "LionsGateImageApiError";
8
+ this.status = status;
9
+ this.payload = payload;
10
+ }
11
+ }
12
+ export class LionsGateImageClient {
13
+ #apiKey;
14
+ #baseUrl;
15
+ #fetch;
16
+ constructor(options) {
17
+ this.#apiKey = options.apiKey;
18
+ this.#baseUrl = (options.baseUrl ?? DEFAULT_API_BASE_URL).replace(/\/+$/, "");
19
+ if (options.fetch) {
20
+ this.#fetch = options.fetch;
21
+ return;
22
+ }
23
+ if (typeof fetch !== "function") {
24
+ throw new Error("A fetch implementation is required.");
25
+ }
26
+ this.#fetch = fetch.bind(globalThis);
27
+ }
28
+ async uploadUserImage(file, options = {}) {
29
+ const formData = new FormData();
30
+ const fileName = options.fileName ??
31
+ ("name" in file && typeof file.name === "string" ? file.name : "image");
32
+ formData.append("file", file, fileName);
33
+ return this.#request("/v1/uploads/user-image", {
34
+ method: "POST",
35
+ body: formData,
36
+ ...requestSignal(options.signal),
37
+ });
38
+ }
39
+ async generateFranchise(input, options = {}) {
40
+ const body = {
41
+ name: input.name,
42
+ user_image_url: input.userImageUrl,
43
+ franchise: input.franchise,
44
+ preset: input.preset,
45
+ };
46
+ setIfDefined(body, "quality", input.quality);
47
+ setIfDefined(body, "partial_image_transform", input.partialImageTransform);
48
+ setIfDefined(body, "blur_partial_images", input.blurPartialImages);
49
+ setIfDefined(body, "options", input.options);
50
+ return this.#request("/v1/franchise/generate", {
51
+ method: "POST",
52
+ body: JSON.stringify(body),
53
+ headers: this.#jsonHeaders(input.idempotencyKey),
54
+ ...requestSignal(options.signal),
55
+ });
56
+ }
57
+ async generateFranchiseImage(input, options = {}) {
58
+ const uploadOptions = {};
59
+ setIfDefined(uploadOptions, "fileName", input.fileName);
60
+ setIfDefined(uploadOptions, "signal", options.signal);
61
+ const upload = await this.uploadUserImage(input.file, uploadOptions);
62
+ const generationInput = {
63
+ name: input.name,
64
+ userImageUrl: upload.user_image_url,
65
+ franchise: input.franchise,
66
+ preset: input.preset,
67
+ };
68
+ setIfDefined(generationInput, "quality", input.quality);
69
+ setIfDefined(generationInput, "idempotencyKey", input.idempotencyKey);
70
+ setIfDefined(generationInput, "partialImageTransform", input.partialImageTransform);
71
+ setIfDefined(generationInput, "blurPartialImages", input.blurPartialImages);
72
+ setIfDefined(generationInput, "options", input.options);
73
+ const generation = await this.generateFranchise(generationInput, requestSignal(options.signal));
74
+ return { upload, generation };
75
+ }
76
+ async generatePfp(input, options = {}) {
77
+ const body = {
78
+ user_image_url: input.userImageUrl,
79
+ franchise: input.franchise,
80
+ };
81
+ setIfDefined(body, "quality", input.quality);
82
+ setIfDefined(body, "num_of_avatars", input.numOfAvatars);
83
+ return this.#request("/v1/pfp/generate", {
84
+ method: "POST",
85
+ body: JSON.stringify(body),
86
+ headers: this.#jsonHeaders(input.idempotencyKey),
87
+ ...requestSignal(options.signal),
88
+ });
89
+ }
90
+ async generatePfpFromFile(input, options = {}) {
91
+ const uploadOptions = {};
92
+ setIfDefined(uploadOptions, "fileName", input.fileName);
93
+ setIfDefined(uploadOptions, "signal", options.signal);
94
+ const upload = await this.uploadUserImage(input.file, uploadOptions);
95
+ const generationInput = {
96
+ userImageUrl: upload.user_image_url,
97
+ franchise: input.franchise,
98
+ };
99
+ setIfDefined(generationInput, "quality", input.quality);
100
+ setIfDefined(generationInput, "numOfAvatars", input.numOfAvatars);
101
+ setIfDefined(generationInput, "idempotencyKey", input.idempotencyKey);
102
+ const generation = await this.generatePfp(generationInput, requestSignal(options.signal));
103
+ return { upload, generation };
104
+ }
105
+ async getResult(generationId, options = {}) {
106
+ return this.#request(`/v1/results/${encodeURIComponent(generationId)}`, requestSignal(options.signal));
107
+ }
108
+ async pollUntilDone(generationId, options = {}) {
109
+ const intervalMs = options.intervalMs ?? 1500;
110
+ const startedAt = Date.now();
111
+ while (true) {
112
+ if (options.signal?.aborted) {
113
+ throw new DOMException("Polling was aborted.", "AbortError");
114
+ }
115
+ const result = await this.getResult(generationId, {
116
+ ...(options.signal ? { signal: options.signal } : {}),
117
+ });
118
+ if (result.done) {
119
+ return result;
120
+ }
121
+ if (options.timeoutMs !== undefined &&
122
+ Date.now() - startedAt >= options.timeoutMs) {
123
+ throw new Error("Generation polling timed out.");
124
+ }
125
+ await delay(intervalMs, options.signal);
126
+ }
127
+ }
128
+ async streamGeneration(generationId, handlers = {}, options = {}) {
129
+ const response = await this.#fetch(this.#url(`/v1/results/${encodeURIComponent(generationId)}/events`), {
130
+ headers: this.#authHeaders({ Accept: "text/event-stream" }),
131
+ ...requestSignal(options.signal),
132
+ });
133
+ if (!response.ok || !response.body) {
134
+ throw await this.#errorFromResponse(response);
135
+ }
136
+ const reader = response.body.getReader();
137
+ const decoder = new TextDecoder();
138
+ let buffer = "";
139
+ while (true) {
140
+ const { value, done } = await reader.read();
141
+ if (done) {
142
+ break;
143
+ }
144
+ buffer += decoder.decode(value, { stream: true });
145
+ const messages = buffer.split(/\r?\n\r?\n/);
146
+ buffer = messages.pop() ?? "";
147
+ for (const message of messages) {
148
+ const parsed = parseSseMessage(message);
149
+ if (!parsed) {
150
+ continue;
151
+ }
152
+ const event = parsed.event;
153
+ const data = parsed.data;
154
+ if (event === "error") {
155
+ const payload = data;
156
+ await handlers.onError?.(payload);
157
+ throw new LionsGateImageApiError(200, payload);
158
+ }
159
+ const result = data;
160
+ if (event === "partial") {
161
+ await handlers.onPartial?.(result);
162
+ }
163
+ else if (event === "final") {
164
+ await handlers.onFinal?.(result);
165
+ await reader.cancel();
166
+ return result;
167
+ }
168
+ else {
169
+ await handlers.onStatus?.(result);
170
+ }
171
+ }
172
+ }
173
+ return this.getResult(generationId, requestSignal(options.signal));
174
+ }
175
+ #url(path) {
176
+ return `${this.#baseUrl}${path}`;
177
+ }
178
+ #authHeaders(headers = {}) {
179
+ const merged = new Headers(headers);
180
+ merged.set("Authorization", `Bearer ${this.#apiKey}`);
181
+ return merged;
182
+ }
183
+ #jsonHeaders(idempotencyKey) {
184
+ const headers = this.#authHeaders({
185
+ "Content-Type": "application/json",
186
+ });
187
+ if (idempotencyKey) {
188
+ headers.set("Idempotency-Key", idempotencyKey);
189
+ }
190
+ return headers;
191
+ }
192
+ async #request(path, init = {}) {
193
+ const response = await this.#fetch(this.#url(path), {
194
+ ...init,
195
+ headers: this.#authHeaders(init.headers),
196
+ });
197
+ if (!response.ok) {
198
+ throw await this.#errorFromResponse(response);
199
+ }
200
+ return (await response.json());
201
+ }
202
+ async #errorFromResponse(response) {
203
+ const payload = (await response.json().catch(() => ({
204
+ error: {
205
+ message: "Request failed.",
206
+ type: "api_error",
207
+ param: null,
208
+ code: null,
209
+ },
210
+ })));
211
+ return new LionsGateImageApiError(response.status, payload);
212
+ }
213
+ }
214
+ function parseSseMessage(message) {
215
+ let event = "status";
216
+ const dataLines = [];
217
+ for (const line of message.split(/\r?\n/)) {
218
+ if (line.startsWith("event:")) {
219
+ event = line.slice(6).trim();
220
+ }
221
+ if (line.startsWith("data:")) {
222
+ dataLines.push(line.slice(5).trimStart());
223
+ }
224
+ }
225
+ if (dataLines.length === 0) {
226
+ return null;
227
+ }
228
+ return {
229
+ event,
230
+ data: JSON.parse(dataLines.join("\n")),
231
+ };
232
+ }
233
+ function delay(ms, signal) {
234
+ return new Promise((resolve, reject) => {
235
+ const timeout = setTimeout(resolve, ms);
236
+ signal?.addEventListener("abort", () => {
237
+ clearTimeout(timeout);
238
+ reject(new DOMException("Operation was aborted.", "AbortError"));
239
+ }, { once: true });
240
+ });
241
+ }
242
+ function requestSignal(signal) {
243
+ return signal ? { signal } : {};
244
+ }
245
+ function setIfDefined(target, key, value) {
246
+ if (value !== undefined) {
247
+ target[key] = value;
248
+ }
249
+ }
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "lionsgate-club-imagegen",
3
+ "version": "0.1.0",
4
+ "description": "Optional client library for the LionsGate Club image generation API.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": ["dist"],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "check-types": "tsc --noEmit -p tsconfig.json",
21
+ "lint": "tsc --noEmit -p tsconfig.json"
22
+ },
23
+ "devDependencies": {
24
+ "typescript": "5.9.2"
25
+ }
26
+ }