@umituz/react-native-ai-pruna-provider 1.0.40 → 1.0.42

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umituz/react-native-ai-pruna-provider",
3
- "version": "1.0.40",
3
+ "version": "1.0.42",
4
4
  "description": "Pruna AI provider for React Native - implements IAIProvider interface for unified AI generation",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -194,25 +194,14 @@ async function buildImageEditInput(
194
194
  if (input.width !== undefined) payload.width = input.width;
195
195
  if (input.height !== undefined) payload.height = input.height;
196
196
 
197
- // Advanced quality parameters
198
- if (input.num_inference_steps !== undefined) {
199
- payload.num_inference_steps = input.num_inference_steps;
200
- generationLogCollector.log(sessionId, TAG, `Added num_inference_steps: ${input.num_inference_steps}`);
201
- }
202
- if (input.guidance_scale !== undefined) {
203
- payload.guidance_scale = input.guidance_scale;
204
- generationLogCollector.log(sessionId, TAG, `Added guidance_scale: ${input.guidance_scale}`);
205
- }
206
- if (input.strength !== undefined) {
207
- payload.strength = input.strength;
208
- generationLogCollector.log(sessionId, TAG, `Added strength: ${input.strength}`);
209
- }
197
+ // Pruna API supported parameters - ONLY add supported ones!
198
+ // p-image-edit supports: images, prompt, aspect_ratio, seed (maybe)
199
+ // Does NOT support: num_inference_steps, guidance_scale, strength
210
200
 
211
201
  generationLogCollector.log(sessionId, TAG, `<<< buildImageEditInput COMPLETE`, {
212
202
  payloadKeys: Object.keys(payload),
213
203
  imageCount: imageUrls.length,
214
204
  hasSeed: !!payload.seed,
215
- hasQualityParams: !!(payload.num_inference_steps || payload.guidance_scale || payload.strength),
216
205
  });
217
206
 
218
207
  return payload;
@@ -22,6 +22,7 @@ import type { LogEntry } from "../utils/log-collector";
22
22
  import {
23
23
  createRequestKey, getExistingRequest, storeRequest,
24
24
  removeRequest, cancelRequest, cancelAllRequests, hasActiveRequests,
25
+ storeRequestIdMapping, getStatusUrlForRequestId, removeRequestIdMapping,
25
26
  } from "./request-store";
26
27
 
27
28
  export class PrunaProvider implements IAIProvider {
@@ -87,7 +88,14 @@ export class PrunaProvider implements IAIProvider {
87
88
  const sessionId = generationLogCollector.startSession();
88
89
  generationLogCollector.log(sessionId, 'pruna-provider', `submitJob() for model: ${model}`);
89
90
  try {
90
- return await queueOps.submitJob(prunaModel, input, apiKey, sessionId);
91
+ const submission = await queueOps.submitJob(prunaModel, input, apiKey, sessionId);
92
+
93
+ // Store requestId -> statusUrl mapping for getJobStatus/getJobResult
94
+ if (submission.statusUrl) {
95
+ storeRequestIdMapping(submission.requestId, submission.statusUrl, model);
96
+ }
97
+
98
+ return submission;
91
99
  } finally {
92
100
  generationLogCollector.endSession(sessionId);
93
101
  }
@@ -96,12 +104,28 @@ export class PrunaProvider implements IAIProvider {
96
104
  async getJobStatus(model: string, requestId: string): Promise<JobStatus> {
97
105
  const apiKey = this.validateInit();
98
106
  const prunaModel = this.validateModel(model);
107
+
108
+ // Look up statusUrl from requestId mapping
109
+ const statusUrl = getStatusUrlForRequestId(requestId);
110
+ if (statusUrl) {
111
+ return queueOps.getJobStatus(prunaModel, statusUrl, apiKey);
112
+ }
113
+
114
+ // Fallback: assume requestId is actually a statusUrl (for direct calls with statusUrl)
99
115
  return queueOps.getJobStatus(prunaModel, requestId, apiKey);
100
116
  }
101
117
 
102
118
  async getJobResult<T = unknown>(model: string, requestId: string): Promise<T> {
103
119
  const apiKey = this.validateInit();
104
120
  const prunaModel = this.validateModel(model);
121
+
122
+ // Look up statusUrl from requestId mapping
123
+ const statusUrl = getStatusUrlForRequestId(requestId);
124
+ if (statusUrl) {
125
+ return queueOps.getJobResult<T>(prunaModel, statusUrl, apiKey);
126
+ }
127
+
128
+ // Fallback: assume requestId is actually a statusUrl (for direct calls with statusUrl)
105
129
  return queueOps.getJobResult<T>(prunaModel, requestId, apiKey);
106
130
  }
107
131
 
@@ -14,7 +14,9 @@ export interface ActiveRequest<T = unknown> {
14
14
 
15
15
  const STORE_KEY = "__PRUNA_PROVIDER_REQUESTS__";
16
16
  const TIMER_KEY = "__PRUNA_PROVIDER_CLEANUP_TIMER__";
17
+ const REQUEST_ID_KEY = "__PRUNA_PROVIDER_REQUEST_IDS__";
17
18
  type RequestStore = Map<string, ActiveRequest>;
19
+ type RequestIdMap = Map<string, { statusUrl: string; model: string }>;
18
20
 
19
21
  const CLEANUP_INTERVAL = 60_000;
20
22
  const MAX_REQUEST_AGE = 3_660_000; // 61 min — must exceed max allowed timeout (1 hour)
@@ -138,6 +140,34 @@ export function stopAutomaticCleanup(): void {
138
140
  stopCleanupTimer();
139
141
  }
140
142
 
143
+ // ─── Request ID to StatusUrl Mapping ───────────────────────────────────────
144
+
145
+ function getRequestIdMap(): RequestIdMap {
146
+ const globalObj = globalThis as Record<string, unknown>;
147
+ if (!globalObj[REQUEST_ID_KEY]) {
148
+ globalObj[REQUEST_ID_KEY] = new Map();
149
+ }
150
+ return globalObj[REQUEST_ID_KEY] as RequestIdMap;
151
+ }
152
+
153
+ export function storeRequestIdMapping(requestId: string, statusUrl: string, model: string): void {
154
+ getRequestIdMap().set(requestId, { statusUrl, model });
155
+ }
156
+
157
+ export function getStatusUrlForRequestId(requestId: string): string | undefined {
158
+ const mapping = getRequestIdMap().get(requestId);
159
+ return mapping?.statusUrl;
160
+ }
161
+
162
+ export function getModelForRequestId(requestId: string): string | undefined {
163
+ const mapping = getRequestIdMap().get(requestId);
164
+ return mapping?.model;
165
+ }
166
+
167
+ export function removeRequestIdMapping(requestId: string): void {
168
+ getRequestIdMap().delete(requestId);
169
+ }
170
+
141
171
  // Clear any leftover timer on module load (hot reload safety)
142
172
  if (typeof globalThis !== "undefined") {
143
173
  const existingTimer = getCleanupTimer();